C语言数组引用

有语句int array[3][4];
不正确的引用方式是哪个?
为什么?
array[i][j]
*(*(array+i)+j)
*(array[i]+j)
*(array+i*4+j)

都正确,也都不正确,要看你的i和j值是多大。

你首先要明白,指针运算符的作用,我用一言以概之,你在哪里使用都不会错。指针运算符*的作用是求出*后面所指地址里的值。因此只要*后面的变量表示的是一个地址就可以使用*运算符,来求出这个地址中的值,你不用管这个地址的表示形式是怎样的,只要是地址就可以使用*来求出地址中的值。

第二:[ ]这个运算符的的运算法则是,把左侧的地址加上[ ]内的偏移量然后再求指针运算,注意有[ ]运算符的地方就有个隐含的指针,比如x[2]表示的就是将指针x偏移2个单位量后再求指针运算。也就说x[2]与*(x+2)是相等的。

只能给你逐句解释了,自已去判断
第1个不用说了,从第2个开始吧
*(*(array+i)+j) 这句也就是先求出array+i处的地址,然后求指针,也就是求值,即*(array+i)这个值仍然是一个地址,因为*(array+i)与array[i]等价,同样后面一句就与arrary[i][j]等价了
*(array[i]+j)这句与上面一句相同
最后一句*(array+i*4+j)这句的作用是把地址array偏移i*4+j这么多个单位,然后再求这个地址处的值,结果也就与*a[i*4+j]相同了。只要i*4+j不超出二维数组的边界,其结果就是正确的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-03-10
*(array[i]+j)不对吧
int array[3][4]在内存中的空间分配简单可以说是这样的
(1234)(5678)(abcd)
array[i][j]显然是对的
*(*(array+i)+j)表示第i个()中的第j个元素
如,当i=1,j=2时,array+i表示(5678),*(array+i)表示(5678)中的5的位置,*(array+i)+j表示(5678)中的7的位置,*(*(array+i)+j)就表示7了
剩下的你自己推吧
楼上的,第四个确实相当于array[i*4+j],但int array[3][4]是二维数组,最多包含12个整型数,若取i=2,j=3这种最大的情况也是array[2*4+3]即array[11]所以并不越界
第2个回答  2010-03-10
第四个不正确。这个选项相当于array[i*4+j],越界。
建议找本关于指针和数组的书,静下心,好好看看。
第3个回答  2010-03-10
*(array[i]+j)
定义数组大小i,那么数组范围是array[0]----->array[i-1].
相似回答