使用指针访问二维数组

3

Is

 *(ary[3]+8)

and

 ary[3][8]

这两者是否相同?如果是,请解释一下如何相同?ary[3]返回的是第一个元素的地址还是ary[3][0]中的值?ary是一个二维数组。

提前致谢。


你也可以这样访问它:*(*(ary+ 3) + 8)。请注意,ary[3]*(ary + 3)是相同的。这应该回答了你的问题。 - Maroun
(ary+3)和ary[3]的值是相同的。(ary+3)返回什么?是ary[3][0]的值还是ary[3]的起始地址? - Srini Vas
@StoryTeller:ary 是一个二维数组。你能分享一下你的知识吗? - Srini Vas
@SriniVas,请看这里http://stackoverflow.com/a/14111286/817643,了解定义真正的二维数组意味着什么。 - StoryTeller - Unslander Monica
4个回答

4

是的

a[i]*(a+i)

ary[i][j]*( *(ary+i)+j))


1
我没有看到之前Srini Vas的评论中存在矛盾。他说指针保存地址,*用于检索该地址处的值。在这种情况下,该值是一个指向(1维)数组的指针。 - ondrejdee
3
什么是反例? - Oliver Charlesworth
1
@StoryTeller:对于a [i] [j]始终等价于*(*(a + i)+ j)。 对于真正的2D数组,这也等同于*((T*)a + 3 * i + j)(其中T是每个元素的类型)。 - Oliver Charlesworth
@OliCharlesworth,如果是这样的话,*(a+i)必须是指针类型。它是什么类型? - StoryTeller - Unslander Monica
1
@StoryTeller:如果你有T a[M][N],那么*(a+i)的类型是T[N],在大多数情况下会衰减为T* - Oliver Charlesworth
显示剩余3条评论

1

*(ary[3]+8) 表示第三行的第八个元素的值。ary[3] 是第三行的基地址。ary[3][8] 也会访问第三行和第八列的同一个元素。

例如,我正在采用一个2行4列的2D数组,它相当于有8个元素的1D数组。如下所示。

int a [8] = {0,1,2,3,4,5,6,7};

int b [2] [4] = {{0,1,2,3},{4,5,6,7}};

由于b是2D数组,因此您可以将其视为两个1D数组的数组。当您传递b [1]b [1] [0]时,它表示第一行的地址。矩形阵列按行在内存中分配。因此,如果要查找元素a [row] [col]的地址,则会计算为

address = baseAddress + elementSize * (row*(total number of column) + col);


ary[3]的基本数组在内存中存储在哪里/如何存储?ary[0..n][0..n]按顺序存储。当调用上述类型时,ary[3]和ary[3][0]必须具有相同的基地址,这是如何解决的? - Srini Vas
@SriniVas 为了更清晰,我修改了我的回答。 - Dayal rai
@SriniVas 啊哈,这就是你的意思。如果你的数组声明为例如 int ary[4][9],那么 ary[i] 的值不会被存储在任何地方。编译器知道你的 ary 是一个二维数组,当你执行 ary[i] 时,它会给出你所说的地址。但请注意,以下示例是完全不同的情况:`int *ary[4]; int ary1[9]; int ary2[9]; int ary3[9]; int ary4[9]; ary[0] = ary1; ary[1] = ary2; ary[2] = ary3; ary[3] = ary4;` 尽管你确实也可以称之为二维数组。在这里,指向第二维的指针被明确地存储了。 - ondrejdee

1
如果x是一个数组(比如说,int类型),那么x[i]只是*(x+i)的语法糖。在你的情况下,ary是一个二维数组(同样是int类型)。通过相同的语法糖机制,ary[i][j]等价于*((*(ary+i))+j),从中可以清楚地看出底层发生了什么。

0

正如其他人已经说过的那样,a[i]只是*(a+i)的简写。

我只想补充一点,它总是有效的,这使我们能够做出像这样的事情:

char a[10];
char b;
char c[10][20];

// all of these are the same:
b = a[5];      // classic
b = *(a + 5);  // pointer shifting
b = 5[a];      // even so!

b = c[5][9];
b = *(c[5] + 9);
b = *(*(c + 5) + 9);
b = *(c + 5)[9];
b = 5[c][9];
b = 5[9][c];  // WRONG! Compiling error

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接