【问题标题】:Array of pointers to 2D arrays, reads incorrect values指向二维数组的指针数组,读取不正确的值
【发布时间】:2016-03-09 02:40:04
【问题描述】:

在使用指针访问二维数组方面我需要一些帮助。

我有 8 个这样声明的全局字符数组:

char s1[4][16], s2[4][16], ... , s8[4][16];

它们的值稍后在 main 函数中设置。

我有一个包含 8 个指向这些数组的指针的数组,

char (*s[8])[4][16];

这个数组中的每个指针都是这样分配的:

s[0] = &s1;
s[1] = &s2;
..
..
s[7] = &s3;

现在访问 s1 的元素, 我做*s[0][i][j],但是我没有得到与s1 相同的值。 s2s3 等也是如此。

谁能告诉我出了什么问题?

【问题讨论】:

  • 你忘记了括号,所以分组是错误的。请记住,声明符与访问变量的表达式具有相同的语法,因此如果声明符需要括号,那么访问变量的表达式也需要。
  • 另一种选择是char (*s[8])[16]; s[0] = s1; 等等,然后您可以使用s[0][i][j] 访问元素。
  • @M.M 你能解释一下为什么在不使用指针的情况下可以正常索引吗?
  • @zorro 所有“数组索引”都使用指针。 x[y] 表示 *(x+y)。在您的实际解决方案中,您可以根据需要将(*s[0])[i][j] 写为s[0][0][i][j]。我的建议是取出四个维度中的第二个,因为它只有大小 1(即在数组表示法中,您将始终将 [0] 作为四个索引中的第二个)
  • @zorro &s1 具有与 char (*)[16] 不兼容的类型 char (*)[4][16]。但是 s1 衰减后的类型为 char (*)[16]

标签: c arrays pointers multidimensional-array


【解决方案1】:

索引运算符[] 的优先级高于间接运算符*,因此您必须使用括号来取消对数组指针的引用。

试试(*s[0])[i][j]

【讨论】:

  • 哇。从来没想过。非常感谢。
猜你喜欢
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
相关资源
最近更新 更多