C++ 将int转换为int*时会发生什么? int val{100}; int*ptr1=(int*)val; int*ptr2=ptr1+5; 标准::cout

C++ 将int转换为int*时会发生什么? int val{100}; int*ptr1=(int*)val; int*ptr2=ptr1+5; 标准::cout,c++,pointers,casting,pointer-arithmetic,C++,Pointers,Casting,Pointer Arithmetic,每行分析一行: int val{ 100 }; int* ptr1 = (int*)val; int* ptr2 = ptr1 + 5; std::cout << ptr2 << '\n' << (int)ptr2 << std::endl; 将十进制值100分配给指针ptr1 int* ptr1 = (int*)val; 此指令调用未定义的行为,仅在数组上下文中允许对指针执行algebric操作 std::cout逐步: std::cout

每行分析一行:

int val{ 100 };
int* ptr1 = (int*)val;
int* ptr2 = ptr1 + 5;
std::cout << ptr2 << '\n' << (int)ptr2 << std::endl;
十进制值
100
分配给指针
ptr1

int* ptr1 = (int*)val;
此指令调用未定义的行为,仅在数组上下文中允许对指针执行algebric操作

std::cout逐步:

std::cout << ptr2 << '\n' << (int)ptr2 << std::endl;
执行此指令后,ptr1的十进制值为100(十六进制为00000064)

现在,ptr2的内存地址与ptr1相同,移动了5个单位。它被移位5*(4字节)=20字节。ptr2表示的内存地址为(00000078) 这就是(int)ptr2为120(100+20)的原因


这个推理有意义吗?

int*ptr2=ptr1+5
调用未定义的行为您期望什么而不是
120
以及为什么?
64
在十六进制中是
100
,这正是您分配指针的对象。您不能将int强制转换为int指针。取消引用这样的指针会导致未定义的行为。用法:int*ptr1=&val@TedKleinBergman指针算法仅在数组的边界内定义(包括最多超过一个结束)。因此
ptr1+1
可以(因为单个元素被视为一个元素数组),但是
ptr1+2
已经被建议改进:添加
ptr2
最终为120的信息,因为这是
5*sizeof(int)
(即指针算术增量为
sizeof(T)
步数)。另外(这在当时帮助我理解了很多指针),补充说,只有当指针实际指向给定类型的对象时,取消引用指针才有效(即,不是UB)。这实际上很有意义。所以在幕后,编译器在ptr1+5上执行指针运算,实际上是这样写的:ptr1+5*sizeof(int)?是的,我肯定这样认为@OliverLambreghts
std::cout << ptr2 << '\n' << (int)ptr2 << std::endl;
int* ptr1 = (int*)val;
int* ptr2 = ptr1 + 5;