偶们来看下面一段代码:
long a[4];
long *p = a;
1[p] = 5;
p[1];
a[1];
可以看到,p[1] = a[1] = 5.
也就是说:
1、定义a数组的时候,a数组自动转换成指针类型,相当于连续定义了4个long指针的效果。所以当使用指针P将a数组的地址读取出来以后,就可以使用指针p来对地址内空间进行赋值了。
2、[]运算符并不是专门的数组的运算符,它要求的格式是:<num1>[<num2>]。
其意义也等同于:
*(<num1>+<num2>)
换个说法,数组也就是很单纯的将两个指针类型的数字进行加法操作,然后再通过*操作符转换成引用类型的数字而已。
所以,偶们在数组运算中,出现的溢出错误:
long a[4];
a[4] = 5;
C++编译器只是简单认为就是一个指针赋值,因此不会对数组越界进行错误检测。