C ++数组[索引]与索引[数组]

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

array [index]和index [array]是编译器功能还是语言功能的可能性。 第二个可能如何?


编译器会转向

index[array]

*(index + array)

用正常的语法,它会转向

array[index]

*(array + index)

因此你会发现两个表达式的计算结果都是相同的。 这适用于C和C ++。


从C的最早几天开始,表达式a[i]就是添加到i的[0]的地址(通过[0]的大小放大),然后解除引用。 事实上,所有这些都是相同的:

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

====

我唯一关心的是实际的去引用。 虽然他们都生成相同的地址,但如果ai的类型不同,则解除引用可能是一个问题。

例如:

    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下测试了一段很短的,看起来没问题,所以我想我的担心是没有根据的,至少对于基本情况来说。 我仍然不知道更复杂的会发生什么,因为这不是我想要做的事情。


正如Matthew Wilson在Imperfect C ++中所讨论的那样,这可以用来在C ++中强制实现类型安全性,方法是阻止将DIMENSION_OF()类宏用于定义下标操作符的类型实例,如下所示:

#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库中STLSOFT_NUM_ELEMENTS()的实现,并在Imperfect C ++的第14章中阅读它。

编辑:一些评论者建议实现不拒绝指针。 它确实(以及用户定义的类型),如以下程序所示。 您可以通过未注释的第16行和第18行来验证这一点。(我只是在Mac / GCC4上执行此操作,并拒绝这两个表单)。

1
2 #include <stlsoft/stlsoft.h>
3
4 #include <vector>
5
6 #include <stdio.h>
7
8 int main()
9 {
10         int     ar[1];
11         int*    p = ar;
12         std::vector<int>        v(1);
13
14         printf("ar: %lun", STLSOFT_NUM_ELEMENTS(ar));
15
16 //      printf("p: %lun", STLSOFT_NUM_ELEMENTS(p));
17
18 //      printf("v: %lun", STLSOFT_NUM_ELEMENTS(v));
19
20         return 0;
21 }
22
链接地址: http://www.djcxy.com/p/86713.html

上一篇: C++ array[index] vs index[array]

下一篇: With arrays, why is it the case that a[5] == 5[a]?