c语言中的二维数组a[a][j]可以表述为*(*(a+1)+j),但是我看不懂这个东西啊 求解释啊

2024-12-29 04:01:26
推荐回答(5个)
回答1:

这个表述是有问题的,*(*(a+1)+j)没有规定首地址,*(a+1)已经表示a+1地址中的数据了,明显与数组概念不合。
a[a][j]里面数组名称和一个维度的数组的个数表示重叠了,所以我换一种方式来表示:a[y][x]。为了便于理解,假定y=3,x=2。在数组中的数据有y行,x列;也就是3行,2列。假定第一行数据为{1,2};第二行数据为{3,4};第三行的数据为{5,6},那么数组a在内存中的数据为从首地址开始的连续6个数据,{1,2,3,4,5,6}。假定首地址为0x01,那么a[0][0]的地址为0x01,对应数据“1”,该可以表示为((行数 + 0x01)+ 列数),该地址的数据可以表示为*((行数 + 0x01)+ 列数),这个表示形式,和题目中的比较接近。以此类推,a[0][1]的地址为0x02,对应数据“2”;a[1][1]为第2行第2列,地址为0x04,对应数据0x04。
由此可以看出a[y][x]可以表示为*((x + &a) + y);&a为数组a的首地址。
不知道这样讲您是否能够理解。同时“c语言中的二维数组a[a][j]可以表述为*(*(a+1)+j)”这个题设本身是错误的,不要被其误导。

回答2:

首先纠正一个题里的小错误,二维数组应该是a[1][j];数组元素的表示方法(以一维为例)a[i]等价于*(a+i),因为数组名即为数组的首地址,(a+i)即为数组a的第i个元素的地址,*(a+i)就理所当然是a[i]了。再说二维数组,二维数组的数组名可看为一个指针的指针,*(a+1)就表示二维数组的第二排数组首地址a[1],然后这个地址加j即为a[1][j]的地址,*(*(a+1)+j)就是二维数组a[1][j]了

回答3:

不可以写成a[a][j]
a+i是一个数组元素的地址,而*(a+i)是取该地址里的数据,如果*(a+i)中保存另一个数组的首地址的话,**(a+i)就能取到另一个数组里的第一个数据.
依次类推,取该数组其他数据*(*(a+i)+j)就能取到第a[i][j]了
最简单直观理解为一个数组中的每个元素又保存了其他数组。

回答4:

*(a+1)表示a向下一行的地址,*(a+1)+j表示向下一行后再向右j列,*(*(a+1)+j)表示地址a向下一行后向右j列的内存地址的值。相当于a[1][j],不知道你说的a[a][j]是什么

回答5:

这个是列指针吧
嗯。你就把二维数组当做指针的指针这样的话感觉起来就轻松多了