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)
====
我唯一关心的是实际的去引用。 虽然他们都生成相同的地址,但如果a
和i
的类型不同,则解除引用可能是一个问题。
例如:
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