C语言 我是初学者

二维数组中、
为什么
a[i]+j表示第i行第j列元素地址、a[i]不是行地址吗?那不是一行一行加的额、
还有为什么a+i*h+j也表示第i行第j列的元素地址、

行地址是说一行的首地址而不是说是行指针。
行地址和列地址的概念就是从把二维数组看成是一维数组的数组,数组每一个元素都是数组
行地址就是将每一行看成一个元素,那么这个元素就可以用a[i]表示,就是第i个元素也就是第i行,
然后+j,就是,因为现在这个元素也是个数组,二a[i]表示的是一个数组的首地址,a[i]+j就是第j个元素。

至于a+i*h+j,就是讲二维数组看成从左到右,从上到下顺序排列,编译器也是这样存的数据。你要取i行j列的数据,
a//二维数组首地址
i*h//每曾一行数组元素就曾i*h个,也就是地址曾i*h,h是数组每一行的长度
j//i行的第j个
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-01-06
首先,a[i]不是表示行地址,而是a+i表示行地址,而a[i]等价于*(a+i),它表示的是第i行的列地址,或者说是第i行的首个元素的地址&a[i][0]。因此a[i]+j表示的是第i行第j列元素的地址,如果在这个地址上再加星号则表示该元素,即*(a[i]+j)等价于a[i][j],实际上由于a[i]等价于*(a+i),所以*(a[i]+j)等价于
*(*(a+i)+j)这也就是我们所常见的元素a[i][j]的表示形式。
至于第二个问题,a表示的是数组a的起始地址,而a+i*h+j表示的不是数组的元素a[i][j]的地址,而是这个数组的第i*h+j行的首地址,如果有地方说这个值表示数组的第i行第j列的元素地址的话,这是错误的,实际上a[0]+i*h+j才表示数组a的元素a[i][j]的地址(如果这个数组的每一行有h个元素的话)。对于这个问题如果你非要这样去理解,那是考虑到a的值和a[0]的值是相同的,也就是同一个存储单元的地址,但是由于这两个的类型完全不一样,所以这种表达方式是错误的。
第2个回答  2014-01-06
数组在内存中是线性存储的