- c++访问数组时,无论以下标方式还是以指针方式访问,都不会对其作界限检查,即使访问超出数组的界限。
- 如下代码,定义一个长度为7的数组,当访问数目超过7时,执行程序编译器不会报错。
int a[7] = { 0,1,2,3,4,5,6 };
int a7=1, a8=1;
int main()
{
int i;
cout << "数组各个元素的地址" << endl;
for (i = 0; i < 9; i++)
{
cout << "a[" << i << "]的地址为" << (a + i) << endl;
}
cout << "a7的地址为" << &a7 << endl;
cout << "a8的地址为" << &a8 << endl;
cout << endl;
cout << "以下标方式访问数组" << endl;
for (i = 0; i < 9; i++)
{
cout << "a["<< i << "]=" << a[i] << " ";
}
cout << endl;
cout << endl;
cout << "以下标方式访问数组" << endl;
for (i = 0; i < 9; i++)
{
cout << "a[" << i << "]=" << *(a+i) << " ";
}
cout << endl;
cout << endl;
cout << "未超限写数组之前a7和a8的数据" << endl;
cout << "a7=" << a7 << endl;
cout << "a8=" << a8 << endl;
cout << endl;
cout << "超限写数组...." << endl;
for (i = 0; i < 9; i++)
{
a[i] = i;
}
cout << endl;
cout << "超限写数组之后a7和a8的数据" << endl;
cout << "a7=" << a7 << endl;
cout << "a8=" << a8 << endl;
}
执行结果如下:
超限的a[7]和a[8]和定义的int类型a7、a8的变量地址相同,当超限访问到a[7]和a[8]时,读出来的数据即和a7、a8的初始化数据相同。当超限写数组的数据,超限写a[7]和a[8]的数据即改变了变量a7、a8的数据。
- 总结: 1. c++编译器不会对数组的超限读写进行检查,超限访问数组的数据可能会得到意想不到的数据,而超限写数组的数据可能会改变其他变量的数据,从而程序可能不会按照预想的情况运行;2. 以下标访问数组本质上还是使用指针访问,数组名就是首地址,下标就是地址的偏移量(个人理解,错误请指出)。