分享

C语言的2个小例子,搞明白数组不再迷茫

 山峰云绕 2020-12-26

问题一:结果是a[2] = 7是哪几条语句

问题二:

哪一句编译器会爆警告:类型不匹配

warning: assignment from incompatible pointer type

a , a[0], &a, &a[0],理解这些符号的时候要和左值右值结合起来,也就是搞清楚每个符号分别做左值和右值时的不同含义。

1、a,表示数组名

a做左值时表示整个数组的所有空间(10×4=40字节)【又因为C语言规定数组操作时要独立单个操作,不能整体操作数组,N 所以a不能做左值】;
a做右值表示数组首元素的首地址 (首元素首地址就是数组的第0个元素的起始地址,也就是a[0]的起始地址)

2、a[0],表示数组的首元素,也就是数组的第0个元素。

a[0]做左值时表示数组第0个元素对应的内存空间(连续4字节);
a[0]做右值时表示数组第0个元素的值(也就是数组第0个元素对应的内存空间中存储的那个数)

3、&a,表示数组名a取地址,字面意思是数组的地址(数组的地址就是数组的首地址(也叫数组的起始地址))

&a不能做左值(&a实质是一个常量,不是变量因此不能赋值,所以自然不能做左值。);
&a做右值时表示【整个数组的首地址】

4、&a[0],字面意思就是数组第0个元素的首地址(搞清楚[]和&的优先级,[]的优先级要高于&,所以a先和[]结合再取地址)。
&a[0] 做左值时表示【数组首元素首地址所对应的内存空间】
&a[0] 做右值时等同于a。表示数组首元素的首地址

问题一:

指针格式访问数组元素是:*(指针+偏移量); 如果指针是数组首元素地址(a或者&a[0]),那么偏移量就是下标;指针参与运算的特点是,指针变量+1,并不是真的加1,而是加1(指针指向的数据

类型);如果是int *指针,则+1就实际表示地址+4字节,如果是char *指针,则+1就表示地址+1字节;如果是double *指针,则+1就表示地址+8字节.

所以*(&a+2)是一个野指针,值是随机的。a[2]=1095666312

&a是整个数组的首地址,而a是数组首元素的首地址。这两个在数字上是相等的,但是意义不相同。意义不相同会导致他们在参与运算的时候有不同的表现。

问题二:p = &a;类型不匹配的原因

p是int * (指向int类型的指针),而&a是int (*)[3] (指向int数组的指针,也即指向整个数组的首地址)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多