C语言二维数组指针问题a[i][j]等价于*(&a[0][0]+n*i+j)

想问一下为什么

a[i][j]等价于(&a[0][0]+ni+j)

该回答引用ChatGPT
在C语言中,二维数组是在内存中连续存储的,其元素存储顺序为“行优先”,即先存储第一行的元素,再存储第二行的元素,以此类推。因此,对于一个二维数组 a[i][j],它的存储地址可以计算为 a[0][0] 的地址加上 i 行 j 列的偏移量。因为数组名 a 在表达式中会自动转换为指向数组第一个元素的指针,因此可以将 a[i][j] 表示为

a[i][j] = *(a[i] + j)

就是一个地址计算问题啊
&a[0][0] + n * i + j --- 这里n应该是二维数组的行长度
a[0][0]是数组起始地址,i表示第i行,那么这行之前就有i行,因为行号从0开始,这i行有多少个元素呢?就是 n * i啊。然后j是第几列,因此再加上j,这个位置就是a[i][j]元素存储位置
a数组是二维数组,但内存存储实际是顺序的,相当于一个很长的一维数组,a[i][j]存储的位置就是&a[0][0] + n * i + j ,你自己画个棋盘一样的格子看一看就知道了

  • 在C++中,多维数组的元素在内存中是连续存储的。对于一个二维数组 a[i][j],可以将其看作一个以 a[0][0] 为起始地址、以 a[n-1][m-1] 为终止地址的连续的一维数组。因此,我们可以用指针运算来访问数组元素。
  • 对于 a[i][j],可以将其表示为 (a[i] + j)。在这个表达式中,a[i] 表示第 i 行的首个元素的地址,也就是第 i 行第 0 列元素的地址,j 表示列的偏移量。因此,a[i] + j 表示第 i 行第 j 列元素的地址,(a[i] + j) 表示该元素的值。
  • 另外,由于数组元素在内存中的连续存储,因此可以用一维数组的方式来访问多维数组。对于二维数组 a[n][m],可以将其表示为 a[im+j]。根据这个表达式,我们可以将 a[i][j] 表示为 a[im+j]。
  • 因此,对于 a[i][j],可以将其表示为 (a + im + j)。又因为 a 是一个指向二维数组首元素的指针,即 a 指向第 0 行第 0 列元素的地址,因此可以将 a[i][j] 表示为 (a + im + j),进一步展开得到 (a + im) + j,最终得到 &a[0][0] + i*m + j。
  • 因此,a[i][j] 等价于 (a[i] + j),等价于 (a + im + j),等价于 &a[0][0] + im + j,其中 m 表示数组的列数。这个等价关系可以帮助我们更方便地进行多维数组的指针运算。