若先给出以下定义:
int *p,a[3],[4];
则赋值语句 p=a;是合法的语句吗?为什么?
注:二维数组名应该理解为一个行指针。二维数组名同样是一个存放地址常量的指针,其值为二维数组中第一个元素的地址。
a[0] a[0][0] a[0][1] a[0][2] a[0][3]
a[1] a[1][0] a[1][1] a[1][2] a[1][3]
a[2] a[2][0] a[2][1] a[2][2] a[2][3]
则a[0]的地址就是a[0][0]的地址,a[0]是“存在”的且是“指针”且a[0]自己的地址“并不是”a[0][0]的地址,a,a[0]与a[0][0]是占用着3个不同地址的存储单元且a[0]内部装着的是a[0][0]的地址。
a的值与a[0]相同,只是a包含a[0],a[1],a[2]。而a[0]包含a[0][0] ~ a[0][3],这样理解对么?
不全对。a的值与a[0]相同,但类型不同。a[0]的类型为int *,是整型指针;a的类型为int (*)[4],是行指针,指向一行有四个整型元素的指针。
你错啦。接着继续想想。你说的与标准答案不同噢。
追答o 惭愧啊
“a是二维数组的行指针”这个是书中说的。其内部装着a[0][0]的地址。
追答是啊,比如说a[0],它其实就是指向二维数组第一行的指针了,本身就是一个指针。那么a就是指向a[0]的指针,也就是指向指针的指针,所以是二维的。而p只是一维的整形指针,如果用p=a,则p指向的内容就会被理解成int类型,但是p本来应该指向的是行地址,所以就类型不匹配了。
追问a[0] a[0][0] a[0][1] a[0][2] a[0][3]
a[1] a[1][0] a[1][1] a[1][2] a[1][3]
a[2] a[2][0] a[2][1] a[2][2] a[2][3]
则a[0]的地址就是a[0][0]的地址,a[0]是“存在”的且是“指针”且a[0]自己的地址“并不是”a[0][0]的地址,a,a[0]与a[0][0]是占用着3个不同地址的存储单元且a[0]内部装着的是a[0][0]的地址。
a的值与a[0]相同,只是a包含a[0],a[1],a[2]。而a[0]包含a[0][0] ~ a[0][3],这样理解对么?
完全正确。