先放上上一讲末尾的代码:
//堆区开辟数组
int main() {
int* arr = new int[10];
for (int i = 0; i < 10; i++)
{
arr[i] = i + 100;
}
for (int i = 0; i < 10; i++)
{
cout << arr[i] << endl;
}
//释放数组 delete 后加 []
delete[] arr;
system("pause");
return 0;
}
这里用了一个指针变量arr来存放数组的首元素地址。
我寻思,既然是数组名,那么arr[i]不就可以写成*(arr + i*sizeof(int))吗?
然而,当我运行时,报了异常。
于是我输出了一下(arr + i*sizeof(int)),
结果是这样的:
明明一个int占4个字节,为什么地址加上4个字节,得到的结果却整整加了一个十六进制位呢?
后来才明白,我犯了一个很低级的错误:对于地址进行加减操作,是以地址的类型为基础的。
比如,你是一个int*型的指针,那么你对这个指针加1,其实地址是加的4。
如果你是一个char*型的指针,那么你对这个指针加1,其实地址是加的1。
这也就解释了,为什么一开始我的代码会报异常,因为我对数组首元素赋值以后,下一个指针指向了16个字节以后的地址,显然有误。
正确代码:
int main() {
int* arr = new int[10];
for (int i = 0; i < 10; i++)
{
*(arr + i )= i + 100;
}
for (int i = 0; i < 10; i++)
{
cout << *(arr + i) << endl;
}
delete[] arr;
return 0;
}
记得一定要delete堆区里的数据!