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
                        
                        
                    