C语言中 二维数组@a[i][j]的地址为什么可以表示成*(a+i)+j难道*(a+i)还表示一个地址的值?求高手详细解释

如题所述

a是一个二维数组,a[i]表示其中的一行,是个一维数组,a[i][j]表示一行里面的一个元素。
*(a+i)就是a[i],是一个一维数组,当然表示一个地址,表示这个一维数组里面的第一个元素a[i][0]的地址。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-22
表达错误,差1错误:
a[i][j]的地址应该表示为:*(a+i-1)+j-1
例:int a[3][4]; 则:
*(a):表示第一行的首地址,即:(*(a))[0],表示第一行第一个元素地址,值为:*((*(a))[0])。
*(a+1):表示第二行的首地址,即:(*(a+1))[0],表示第二行第一个元素地址,值为:*((*(a+1))[0])。
*(a+2):表示第三行的首地址,即:(*(a+2))[0],表示第三行第一个元素地址,值为:*((*(a+2))[0])。
*(a+3-1)+4-1:表示最后一个元素的地址。它的值是:*(*(a+3-1)+4-1)
第2个回答  2011-03-22
依据《c语言深度剖析》“多维数组与多级指针”章节 原文如下:
以数组下标的方式来访问其中的某个元素:a[i][j]。编译器总是将二维数组看成是一个
一维数组,而一维数组的每一个元素又都是一个数组。a[3]这个一维数组的三个元素分别为:
a[0],a[1],a[2]。每个元素的大小为 sizeof(a[0]),即 sizof(char)*4。
由此可以计算出 a[0],a[1],a[2]
三个元素的首地址分别为& a[0],& a[0]+ 1*sizof(char)*4,& a[0]+ 2*sizof(char)*4。亦即 a[i]
的首地址为& a[0]+ i*sizof(char)*4。这时候再考虑 a[i]里面的内容。就本例而言,a[i]内有 4
个 char 类型的元素,其每个元素的首地址分别为&a[i],&a[i]+1*sizof(char),
&a[i]+2*sizof(char),&a[i]+3*sizof(char),即 a[i][j]的首地址为&a[i]+j*sizof(char)。再把&a[i]
的值用 a 表示,得到 a[i][j]元素的首地址为:a+ i*sizof(char)*4+ j*sizof(char)。同样,可以换
算成以指针的形式表示:*(*(a+i)+j)。追问

能解释一下sizof(char)是什么意思吗?
还有sizeof的意思也解释一下,看到过,但不知道什么意思

追答

sizeof(char)就是取字符类型在内存中占的字节数,和计算机的位数有关,一般都是占一个字节。
“sizof(char)”是误写!!
去百度文库下载《c语言深度剖析》看一下吧,要pdf格式的那种。

本回答被提问者采纳
第3个回答  2011-03-22
在这里,*a[i]是一个指针变量,它指向含j个元素的一维数组。
相似回答