gpt4 book ai didi

c++ - [][] 的含义是否特定于上下文?

转载 作者:行者123 更新时间:2023-11-28 05:11:09 25 4
gpt4 key购买 nike

我一直认为x[i] 等价于*(x+i)。所以 x[i][j] 等同于 *(*(x+i)+j),在这种情况下意味着二维数组必须被实现为一个指针数组,这些指针中的每一个都必须被取消引用。

但我了解到您可以通过这种方式在堆上创建一个二维数组:

char (*arr)[256]=malloc(512*256);

如果前一个假设是正确的,那么 arr[i][j] 将访问一个未经授权的位置(因为我们解引用了两次)。

如果是二维数组,我之前的假设是错误的吗?

最佳答案

  • x[i] 确实等同于 *(x+i)。指针运算用于后一种形式。
  • 如果是二维数组type array[x][y];,则必须分几步应用上述规则。
  • array 在表达式中使用时,衰减为指向第一个元素的指针,在这种情况下为类型 type(*)[y] - an数组指针 指向数组数组中的第一个数组。不要将数组指针与“指针数组”混淆,后者的含义完全不同。
  • 因此array + i 对这样的数组指针执行指针运算。 *(array + i) 给出指向的项目,一个一维数组。
  • 如果出于某种未知原因,您希望仅使用指针运算来访问二维数组中的单个项目,那么您将不得不像这样编写一些晦涩难懂的内容:

    *( *(array + i) + j)

If the former hypothesis is right, then arr[i][j] would access an unauthorized location (since we are dereferencing two times).

嗯,这是不对的。如果您有一个数组指针,例如 char (*arr)[256],那么您可以访问作为 arr[i][j] 的项。请注意 arr[i] 执行相同类型的指针运算,因此您得到“char[256] 数组编号 i”。然后在该数组中访问项目 j

这其实就是使用这种语法的原因。如果您像这样编写更正确的 malloc 类型:

char (*arr)[512][256]=malloc( sizeof(char[512][256]) );

然后你必须在使用它之前取消引用数组指针,(*arr)[i​​][j] 否则你将在整个二维数组上进行指针运算。


问题Correctly allocating multi-dimensional arrays解释和说明基于指针数组的查找表与真正的多维数组之间的区别。

关于c++ - [][] 的含义是否特定于上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43474058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com