题目解析:
a是一个二维数组,p是一个指针函数,指向有3个int型元素的数组。p = a,a作左值表示a[0]的地址,即&a[0],所以p = a也可以写成p = &a[0]。
答案解析:
A、*(p=2),意思是将2这个地址赋值给指针p,之后解引用p取值,p=2类型不匹配,错。
B、(p+1)+2,意思是指针p+3,指向a[3],数组的第一维只有2,指针p指向了未知空间,错。
C、p[1]+1,p[]是一个一级指针,p[1] = *(p+1)。意思是p先指向下一个,即a[1],解引用是a[1]第一个元素的地址(a[1][0]),+1表示该指针指向a[1][1]的地址空间。对。
D、同C,p[2] = *(p+2),即指向a[2][0]的地址空间,超出数组a的范围。错。
关于指针和数组的赋值
(1)二位数组
int (*p)[3], a[2][3];
p = &a; //错的
上面的赋值是错的。p是int (*)[3]类型。而&a代表的是整个二位数组的地址,它的类型应该是int (*p)[2][3]的。改成下面的就对了。
int a[2][3];
int (*p)[2][3] = &a;
(2)一维数组
int a[3], p;
p = a;//对的
p = &a; //错的
a作为左值表示首元素a[0]的地址(&a[0]),它是int类型。
&a作左值表示整个数组的地址,它是int ()[3]类型。改成下面的就对了
int (*p)[3], a[3];
p = &a; //对了