指针自增后,增加的字节数到底和什么有关系?
今天在利用指针遍历一维数组的时候,当解引用一个元素后,指针++,很好奇指针指向的地址字节数到底前进了多少,与什么有关,于是做了一些实验
先把代码发出来
#include <iostream>
using namespace std;
int main()
{
short arr[] = { 1,2,3,4,5,6,7,8,9,10 };
short* p = arr;
for (int i = 0; i < sizeof(arr)/sizeof(short); i++)
{
cout << *p << " ";
cout << "第" << i + 1 << "个元素的地址 " << &arr[i] << endl;
cout << "p当前所指向的地址为 :" << p << endl;
cout << endl;
p++;
}
cout << sizeof(short);
system("pause");
return 0;
}
思考过程
首先,数组的元素在内存中的地址是连续的。依照这一思路,我分别打印了数组元素的地址和指针的地址,发现指针自增后的地址,正好指向的就是数组当前元素的下一个元素的地址 这时候拿出我们的祖传计算器““ (这里我为什么不用int强制转换呢,一会会有解释),将十六进制的地址转换成十进制,方便我们计算,这里只算了前两个元素的地址
神奇的事发生了,正好差2个字节,而我定义的指针类型为short,也刚好是2个字节,为了严谨,我又用同样的方法实验了int,结果每次指针自增的量就是4个字节,结果就得证了。
结论
让指针去下一个内存(前进字节数与定义的指针类型息息相关),指针类型是多少字节,指针++前进的就是多少字节
补充: 关于为什么不直接用int将16进制的地址强制转换成int,我用的VS2022版本,地址的字节是8个字节,而int是4个字节,大转小会造成丢失,所以就用的祖传计算器。
|