C语言的问题。。。关于二维数组的。。。。

a+0表示第0行的首地址,与a[0]或&a[0][0]的值相同,但意义及参与的运算不同。。。。请问意义及参与的运算哪里不同?

从二维数组的角度来看,a是二维数组名,a代表整个二维数组的首地址,也是二维数组0行的首地址a+1代表第一行的首地址。
int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}
设数组a的首地址为1000。
a[0]是第一个一维数组的数组名和首地址,因此也为1000。*(a+0)或*a是与a[0]等效的, 它表示一维数组a[0]0 号元素的首地址,也为1000。&a[0][0]是二维数组a的0行0列元素首地址,同样是1000。因此,a,a[0],*(a+0),*a,&a[0][0]是相等的。
同理,a+1是二维数组1行的首地址,等于1008。a[1]是第二个一维数组的数组名和首地址,因此也为1008。&a[1][0]是二维数组a的1行0列元素地址,也是1008。因此a+1,a[1],*(a+1),&a[1][0]是等同的。
由此可得出:a+i,a[i],*(a+i),&a[i][0]是等同的。
此外,&a[i]和a[i]也是等同的。因为在二维数组中不能把&a[i]理解为元素a[i]的地址,不存在元素a[i]。C语言规定,它是一种地址计算方法,表示数组a第i行首地址。由此,我们得出:a[i],&a[i],*(a+i)和a+i也都是等同的。
另外,a[0]也可以看成是a[0]+0,是一维数组a[0]的0号元素的首地址,而a[0]+1则是a[0]的1号元素首地址,由此可得出a[i]+j则是一维数组a[i]的j号元素首地址,它等于&a[i][j]。
简单来说,a+0,&a[0][0]为地址值。而a[0]为存储在此地址的数值。

参考资料:http://zhidao.baidu.com/question/96131416.html?si=2

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-01-05
对于二维数组int a[M][N],表示的是一个有M个元素的数组,每个元素是一个行,也就是一个int[N]类型的数据。
a+i等同于&a[i],表示“第i个元素也就是第i行”的地址,是一个“包含N个int元素的数组”的地址。
a[i]等同于&a[i][0]表示“第i个元素也就是第i行”,由于本身一行也是一个数组,所以也可以说它表示这一行第0个元素的地址,也就是&a[i][0],是“一个int元素”的地址。
这就是他们的意义的不同。
根据意义不同再来看运算,
前者加*也就是*(a+i)表示的是一个“包含N个int元素的数组”,
后者加*也就是*a[i]或者*&a[i][0]表示的是“一个int元素”;
对前者+1前进的是一个“包含N个int元素的数组”那么远,
对后者+1前进的是“一个int元素”那么远。

PS:上面的i全部写成0就是你问的内容,但i可以是从0到M-1的任意整数。
第2个回答  2011-01-05
如果数组是a[x][y]这样的话,a+0的数据类型是 int **,a[0]的数据类型是int*,&a[0][0]的数据类型是int*,这就是意义的不同之处。参与运算时,由于数据类型不同,取值方式就不同,a+0需要**运算,a[0]和&a[0][0]需要*运算本回答被提问者和网友采纳
第3个回答  2011-01-05
推荐你看看林跃的高质量程序设计
相似回答