先给出以下定义:
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]就是a[0][0]的地址。。
为什么呢?
1.“你不可以 p = a; 因为a是二维数组。”二维数组怎么了?这是为什么呢?
2.“但是你可以 p = (int*)a;”为什么呢?这个 p = (int*)a;的含义是什么?
3.“ p = *a; ”这里的这个是什么含义?为什么?
a 类型是 int *const [4], 相当于 int **, 显然你不能吧int ** 直接赋值给int*;
因为a是个地址,指向数组开始地址,p = (int*)a;意义就是把数组开始地址给p
p=*a; 则是把数组第一行地址给p,实际上就是把数组开始地址给p;
指针或者数组的 *a就是等同于a[0]
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][0]地址。a[0]并不存在,计算出来的。a[0][0]就是数据, a是指针,两个是存在的。
a的内容 包含的是12个连续在一起的数据, a 指向该数据的开始位置, 类型为 int *[4];
a[0]是通过a计算的,为 *(a+0) 类型也是个指针int *,实际上也是数据的开始位置。而 a[0][0] 则
表示该数据区的第一个数据的内容。 你需要用& (a[0][0]) 才能的到地址,结果就是a[0]
为什么呢?