美文网首页程序员
关于C / C ++指针的前5个问题

关于C / C ++指针的前5个问题

作者: C语言学习圈 | 来源:发表于2019-02-21 22:13 被阅读1次

    本文总结了有关stackoverflow.com上有关C / C ++指针的首要问题。指针是C / C ++中最令人困惑的部分,这些问题使用简单的示例来解释关键指针概念。

    1.在不使用循环的情况下从1到1000计数

    #include <stdio.h> 

    #include <stdlib.h>

    void main (int j ){ 

    printf (“%d \ n ” , j ); 

    (& main + (&exit - & main )* ( j / 1000 ))( j + 1 ); 

    }

    计数1到1000的唯一其他方法是使用递归。根据C语言,j在开头就有'1'的值。当1 <= j <1000时,&main +(&exit - &main)*(j / 1000)总是被评估为&main,这是main的内存地址。(&main)(j + 1)是我们想要获得的下一次迭代,它将在屏幕上打印“2”等。此递归的停止条件是当j命中1000时,&main +(&exit - &main)* (j / 1000)求值为&exit,这将优雅地退出此过程,并将错误代码1001返回给操作系统。

    2.为什么[5] == 5 [a]?

    a [b]表示C标准的*(a + b)。a是基址,b是从a开始的偏移量。a [b]是a + b的地址中的值。

    因此,+ 5和5 + a是相同的存储器地址。它们的值*(a + 5)和*(5 + a)是相同的。所以[5] == 5 [a]

    3.我们可以拥有多少级别的指针?

    和人类一样可以处理。任何c / c ++编译器肯定都支持更多。

    4.指向数组/指针数组的C指针消歧

    以下声明之间有什么区别:

    int * arr1 [ 8 ] ;

     int (* arr2 )[ 8 ] ;

     int * ( arr3 [ 8 ] );

    通过C优先级表,array [],函数return()优先于指针*。

    对于int * arr1 [8],

    arr1首先是一个数组,无论元素是什么类型。在应用指针*之后,我们知道arr1是一个int指针数组。

    对于int(* arr2)[8] 

    通过括号覆盖规则,在这种情况下,指针*优先于array []。然后arr2首先是一个指针,无论它指向什么。在应用array []之后,我们知道arr2是一个指向int数组的指针。

    对于int *(arr3 [8])

    在这种情况下,Bracket不会更改任何默认优先级,因此它与int * arr1 [8]相同

    5. const指针有什么意义?

    (1)void foo(int * const ptr); 

    (2)void foo(int * ptr);

    对于foo的调用者,ptr的值被复制到(1)和(2)中的foo中。

    (1)和(2)仅对foo的实现者有所不同,而不是foo的客户端。

    在(2)中,实现者可能会意外地改变可能引入错误的ptr的值。

    (1)就像实现者在编写foo体之前对编译器说的那样,“嘿,我不想重视ptr,如果以某种模糊的方式改变它,让编译失败,让我检查一下”

    另外本人从事在线教育多年,将自己的资料整合建了一个QQ群,对于有兴趣一起交流学习C/C++的初学者可以加群:825414254,里面有大神会给予解答,也会有许多的资源可以供大家学习分享,欢迎大家前来一起学习进步!

    相关文章

      网友评论

        本文标题:关于C / C ++指针的前5个问题

        本文链接:https://www.haomeiwen.com/subject/ztdjyqtx.html