首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ array[index] vs index[array]

C++ array[index] vs index[array]
EN

Stack Overflow用户
提问于 2009-05-25 07:26:17
回答 4查看 4.7K关注 0票数 15

可能重复: 在C数组中,为什么这是真的?a[5] == 5[a]

数组、索引数组、编译器特性或语言特性的可能性。第二个怎么可能?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-05-25 07:30:03

编译器将转

代码语言:javascript
复制
index[array]

转到

代码语言:javascript
复制
*(index + array)

如果使用普通语法,就会发生变化。

代码语言:javascript
复制
array[index]

转到

代码语言:javascript
复制
*(array + index)

因此,您可以看到,这两个表达式的计算值相同。这对于C和C++都适用。

票数 30
EN

Stack Overflow用户

发布于 2009-05-25 07:29:09

从C的早期开始,表达式a[i]就是添加到i中的一个地址(按a的大小进行缩放),然后取消引用。事实上,所有这些都是等同的:

代码语言:javascript
复制
a[i]
i[a]
*(a+i)

==== 我唯一关心的就是真正的离题。虽然它们都生成相同的地址,但如果ai的类型不同,则取消引用可能会引起关注。 例如:

代码语言:javascript
复制
    int i = 4;
    long a[9];
    long x = a[i]; //get the long at memory location X.
    long x = i[a]; //get the int at memory location X?

我还没有真正测试过这种行为,但这是你可能需要注意的事情。如果它确实改变了被取消引用的内容,那么它可能也会导致对象数组的各种问题。 ====

更新:

您可能可以安全地忽略=====行之间的位。我在Cygwin下做了短时间和长时间的测试,看起来还不错,所以我想我的担心是没有根据的,至少在基本的情况下是这样。我仍然不知道更复杂的事情会发生什么,因为这不是我想要做的事情。

票数 6
EN

Stack Overflow用户

发布于 2009-05-25 08:59:20

正如Matthew在http://www.imperfectcplusplus.com/中所讨论的那样,可以通过防止在定义下标运算符的类型的实例中使用DIMENSION_OF()-like宏来执行C++中的类型安全,如下所示:

代码语言:javascript
复制
#define DIMENSION_OF_UNSAFE(x)  (sizeof(x) / sizeof((x)[0]))

#define DIMENSION_OF_SAFER(x)  (sizeof(x) / sizeof(0[(x)]))

int ints[4];

DIMENSION_OF_UNSAFE(ints); // 4
DIMENSION_OF_SAFER(ints); // 4

std::vector v(4);

DIMENSION_OF_UNSAFE(v); // gives impl-defined value; v likely wrong
DIMENSION_OF_SAFER(v); // does not compile

对于处理指针,还有更多,但这需要一些额外的模板智能。查看STLSOFT_NUM_ELEMENTS()STLSoft库中的实现,并阅读http://www.imperfectcplusplus.com/第14章中的所有相关内容。

编辑:一些评论者建议,实现不拒绝指针。它确实(以及用户定义的类型),如下面的程序所示。您可以通过未注释的第16行和第18行来验证这一点。(我刚刚在Mac/ on 4上这样做,它拒绝这两种形式)。

代码语言:javascript
复制
#include <stlsoft/stlsoft.h>
#include <vector>
#include <stdio.h>

int main()
{
    int     ar[1];
    int*    p = ar;
    std::vector<int>        v(1);

    printf("ar: %lu\n", STLSOFT_NUM_ELEMENTS(ar));

//  printf("p: %lu\n", STLSOFT_NUM_ELEMENTS(p));

//  printf("v: %lu\n", STLSOFT_NUM_ELEMENTS(v));

    return 0;
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/905724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档