[][] 的含义是特定于上下文的吗?

Posted

技术标签:

【中文标题】[][] 的含义是特定于上下文的吗?【英文标题】:Is the meaning of [][] context-specific? 【发布时间】:2017-04-18 13:47:10 【问题描述】:

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

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

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

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

我之前的假设在二维数组的情况下是错误的吗?

【问题讨论】:

int a[3][4]; 这样的二维数组不是指针数组——根本不涉及指针。它们是数组的数组。 “二维数组”只是一个数组数组。尝试在纸上画出一个,你会发现它应该可以组合在一起,即使使用指针运算也是如此。 一些不错的阅读:***.com/questions/2565039/… 我明白了。我理解数组的东西,但是“指针数组”的解决方案不是实现二维数组的完全正确的方法,而且它更符合 [] 的定义吗? 数组的主要原则之一是它们在内存中是连续的。因此,简单的数组数组不能是指针数组(因为它不再是连续的)。 【参考方案1】: x[i] 确实等价于*(x+i)。后一种形式使用指针算法。 如果是二维数组type array[x][y];,那么您必须分几个步骤应用上述规则。 array 在表达式中使用时,衰减为指向第一个元素的指针,在这种情况下为 type(*)[y] 类型 - 一个数组指针 指向数组数组中的第一个数组。不要将数组指针与“指针数组”混淆,这意味着完全不同的东西。 因此array + i 对这样的数组指针执行指针运算。 *(array + i) 给出指向的项目,一维数组。

如果你出于某种未知的原因想要仅使用指针算法访问二维数组中的单个项目,那么你将不得不写一些像这样的晦涩的东西:

*( *(array + i) + j)

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

嗯,这是不对的。如果您有一个数组指针,例如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解释并说明了基于指针数组的查找表与真正的多维数组之间的区别。

【讨论】:

谢谢你的详细信息我现在知道了,我的误解是我一直认为当你做 char arr[m][n]; arr 被视为 char**,因此它是一个指针数组,其中 [] 对单个 char 进行指针运算,这似乎是实现 2D 数组的合理方式。 @user2370139 数组和指针是不同的类型。只是数组在表达式中使用时会衰减为指向第一个元素的指针。

以上是关于[][] 的含义是特定于上下文的吗?的主要内容,如果未能解决你的问题,请参考以下文章

Apple 推送通知服务是针对特定国家/地区的吗?

FCM 令牌是特定于应用程序还是设备?

C++异常处理运行时是如何实现的?

在全局(单例)服务中使用特定于请求的上下文

Primefaces DataTable 的特定于列的上下文菜单

PytzUsageWarning:zone 属性是特定于 pytz 的接口的;请迁移到新的时区提供商