【问题标题】:two dimensional Arrays access using pointers使用指针访问二维数组
【发布时间】:2013-06-29 10:58:26
【问题描述】:

 *(ary[3]+8)

 ary[3][8]

是一样的吗?如果是,请解释如何? ary[3] 返回第一个元素的地址或 ary[3][0] 中的值? ary 是一个二维数组。

提前致谢。

【问题讨论】:

  • 您也可以像这样访问它:*(*(ary+ 3) + 8)。请注意,ary[3]*(ary + 3) 相同。这应该可以回答您的问题。
  • *(ary+3) 和 ary[3] 处的值相同。 *(ary+3) 返回什么? ary[3][0] 处的值还是 ary[3] 的起始地址?
  • @StoryTeller : ary 是二维数组。您能分享一下您对此的了解吗?
  • @SriniVas,请参阅此处stackoverflow.com/a/14111286/817643,了解定义真正的二维数组的含义

标签: c arrays pointers


【解决方案1】:

是的

a[i]*(a+i) 相同

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

【讨论】:

  • 不 *(ary+i) in *(*(ary+i)+j)) 在 ary[i] 返回值?指针保存一个地址,* 是检索地址处的值。这样,*(ary+i) 必须返回 ary+i 中的值。我们将 j 添加到地址 ary+i 处的值,并更改从上一步获得的地址处的值。这不是它的工作方式或工作方式吗?
  • 我在之前的 Srini Vas 的评论中没有看到矛盾。他说指针持有和地址,* 是检索地址处的值。在这种情况下,该值是一个指向 (1dim) 数组的指针。
  • @StoryTeller:什么是反例?
  • @StoryTeller:总是a[i][j] 等价于*(*(a+i) + j)。对于真正的二维数组,这等价于*((T*)a + 3*i + j)(其中T 是每个元素的类型)。
  • @StoryTeller:如果你有T a[M][N],那么*(a+i) 的类型是T[N],在大多数情况下会衰减为T*
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    例如,我取一个两行四列的二维数组,它相当于一维数组的 8 个元素。如下所示。

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

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

    因为b 是二维数组,所以您可以将其视为两个一维数组的数组。当您传递 b[1] 或 b[1][0] 时,它表示第一行的地址。在内存中分配的矩形数组通过 Row.so 如果你想找到元素 a[row][col] 的地址,它将被计算为

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

    【讨论】:

    • ary[3] 的基本数组存储在内存的何处/如何存储? ary[0..n][0..n] 按顺序存储。 ary[3] 和 ary[3][0] 必须具有相同的基地址,当被上述类型的调用调用时如何解析?
    • @SriniVas 为清楚起见编辑了我的答案。
    • @SriniVas 啊哈,这就是你的意思。如果您的数组声明为例如,ary[i] 的值不会存储在任何地方。 int ary[4][9]。编译器知道您的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; 尽管您确实也可以将其称为二维数组。在这里,指向第二维的指针被显式存储。
    【解决方案4】:

    正如其他人已经说过的,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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多