问题一:结果是a[2] = 7是哪几条语句 问题二: 哪一句编译器会爆警告:类型不匹配 warning: assignment from incompatible pointer type a , a[0], &a, &a[0],理解这些符号的时候要和左值右值结合起来,也就是搞清楚每个符号分别做左值和右值时的不同含义。 1、a,表示数组名 a做左值时表示整个数组的所有空间(10×4=40字节)【又因为C语言规定数组操作时要独立单个操作,不能整体操作数组,N 所以a不能做左值】; 2、a[0],表示数组的首元素,也就是数组的第0个元素。 a[0]做左值时表示数组第0个元素对应的内存空间(连续4字节); 3、&a,表示数组名a取地址,字面意思是数组的地址(数组的地址就是数组的首地址(也叫数组的起始地址)) &a不能做左值(&a实质是一个常量,不是变量因此不能赋值,所以自然不能做左值。); 4、&a[0],字面意思就是数组第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数组的指针,也即指向整个数组的首地址) |
|
来自: 山峰云绕 > 《C语言数据结构描述Windows程序设计》