c – 指针表示法

我没有发现指针理论特别麻烦,但我偶尔会被一些符号弄乱.在下面的例子中,有人可以解释行p =(int *)a是如何工作的.我对代码的解释表明,这一行只是将第一个数组的第一个元素的地址存储在指针p中,这样printf(“%u”,* p)就产生了5.如果是这种情况就是这个线条只是一种更间接的写作方式p = a [0]?
int main()
{
    int a[][4] = {
        5,7,5,9,4,6,3,1,2,6
        };



    int *p; // create an integer pointer
    int (*q)[4]; // create a pointer to a four-element integer array

    p = (int*)a; // ?
    q = a;


    printf("%u %u\n",p,q);
    p++;
    q++;
    printf("%u %u\n",q);


    return 0;
}

解决方法

当在值上下文中使用时,表达式a确实将评估为“数组的第一个元素的地址” – [0]的地址 – 正如您正确理解的那样.

但是,请注意,数组a实际上就是我们所说的2D数组.它是一个数组数组.数组a的第一个元素本身就是一个数组:int [4]类型的数组.因此,考虑到上述情况,表达式a在值上下文中使用时,等同于表达式& a [0],它是int(*)[4]类型的指针,并且在概念上指向整个1D数组一个[0].

出于这个原因,尝试做

p = a;

将导致编译器发出诊断消息.将int(*)[4]值赋给int *指针对象是非法的.这些类型不兼容.为了抑制此诊断消息,所讨论的代码使用显式强制转换

p = (int *) a;

这有力地将上述int(*)[4]指针值推入p.在典型的实现中,这保留了原始指针的数值,仅执行概念类型转换.

尝试访问* p的值通常会产生[0] [0]的值,因为数字上整个a的地址与[0]的地址相同,并且与地址相同一个[0] [0].上面的代码利用了这个数字标识,同时使用显式转换来解决类型不兼容问题.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...