为什么两个指针之间的差异不等于类型的大小?
Why difference between two pointers is not equals to size of type?
我有简单的程序:
#include <iostream>
using namespace std;
int main()
{
int a = 5;
int b = 6;
int* p1 = &a;
int* p2 = &b;
std::cout << p1 << " " << p2 << " ,sizeof(int)=" << sizeof(int) << std::endl;
system("pause");
return 0;
}
它产生以下输出:
00DBF9B8 00DBF9AC ,sizeof(int)=4
但是,00DBF9B8 - 00DBF9AC == С
。我无法理解这个结果。
如果我这样修改程序:
#include <iostream>
using namespace std;
int main()
{
static int a = 5;
static int b = 6;
int* p1 = &a;
int* p2 = &b;
std::cout << p1 << " " << p2 << " ,sizeof(int)=" << sizeof(int) << std::endl;
system("pause");
return 0;
}
我得到了正确的结果:
00394000 00394004 ,sizeof(int)=4
不能保证局部变量(甚至静态变量)放在连续的内存地址上。实际上,如果你减去两个不指向同一个数组的指针值,那将是未定义的行为。
但是你可以使用指针算法如下:
int main()
{
int a;
int* p1 = &a;
int* p2 = p1+1;
std::cout << p1 << " " << p2 << " ,sizeof(int)=" << sizeof(int) << std::endl;
return 0;
}
请注意,单个整数值可能被视为大小为 1 的数组,因此 p1+1
指向 "one after the last element of an array",因此操作 p2 = p1+1
实际上是有效的(当然,取消引用 p2
将无效。
我有简单的程序:
#include <iostream>
using namespace std;
int main()
{
int a = 5;
int b = 6;
int* p1 = &a;
int* p2 = &b;
std::cout << p1 << " " << p2 << " ,sizeof(int)=" << sizeof(int) << std::endl;
system("pause");
return 0;
}
它产生以下输出:
00DBF9B8 00DBF9AC ,sizeof(int)=4
但是,00DBF9B8 - 00DBF9AC == С
。我无法理解这个结果。
如果我这样修改程序:
#include <iostream>
using namespace std;
int main()
{
static int a = 5;
static int b = 6;
int* p1 = &a;
int* p2 = &b;
std::cout << p1 << " " << p2 << " ,sizeof(int)=" << sizeof(int) << std::endl;
system("pause");
return 0;
}
我得到了正确的结果:
00394000 00394004 ,sizeof(int)=4
不能保证局部变量(甚至静态变量)放在连续的内存地址上。实际上,如果你减去两个不指向同一个数组的指针值,那将是未定义的行为。
但是你可以使用指针算法如下:
int main()
{
int a;
int* p1 = &a;
int* p2 = p1+1;
std::cout << p1 << " " << p2 << " ,sizeof(int)=" << sizeof(int) << std::endl;
return 0;
}
请注意,单个整数值可能被视为大小为 1 的数组,因此 p1+1
指向 "one after the last element of an array",因此操作 p2 = p1+1
实际上是有效的(当然,取消引用 p2
将无效。