关于C语言中“二维数组和数组元素的地址”的为问题。

先给出以下定义:
int *p,a[3],[4];
则赋值语句 p=a;是合法的语句吗?为什么?
备注:二维数组名应该理解为一个行指针。二维数组名同样是一个存放地址常量的指针,其值为二维数组中第一个元素的地址。

第1个回答  2011-08-10
呵呵,首先你的二维数组写错了。这个赋值语句是不合法的,因为指针p是指向一个int值的,而a是指向一个int指针的指针,它俩的类型都不同。。所以这个语句是不合法的。。追问

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]的地址。。

第2个回答  2011-08-10
数组名可以认为是个指针常量。
int *p,a[3][4];

你不可以 p = a; 因为a是二维数组。
但是你可以 p = (int*)a; 或者 p = a[0];或者 p = *a;追问

为什么呢?
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]

本回答被提问者采纳
第3个回答  2011-08-10
p是一维指针, (int*)a是强制转换,转换二维指针得到一个一维指针给p当然可以。
p=*a,*a是一维指针,所以一维指针给一维指针赋值当然可以
第4个回答  2011-08-10
不可以追问

为什么呢?

相似回答