运行此代码返回我认为是realPtr地址的整数值.
我还是C++的新手,我想知道 - 是否有可能从一个数据类型指针转换为另一个数据类型指针,指定值的指针变量仍会打印出正确的值(即*integerPtr打印出2)?
代码段
double real = 2.0;
double *realPtr = ℜ
int *integerPtr;
integerPtr = ((int*)&realPtr);
cout << *integerPtr << endl;
Run Code Online (Sandbox Code Playgroud)
产量
1606416424
Run Code Online (Sandbox Code Playgroud)
谢谢!
您在这里处理的是3种完全不同的类型:
由于每个指针本质上都是相同的类型,因此您可以将指针转换为任何其他类型.假设你有自己的Foo类与表示数值无关.你可能仍然这样做:
int* p_int = 2;
Foo* p_foo = (Foo*) p_int;
Run Code Online (Sandbox Code Playgroud)
这是合法的,但这很可能会导致错误,除非 Foo对象的内存表示类似于int的内存表示.
如果要将int转换为double,则必须转换数据,转换指针将不会执行任何操作.这就是为什么在C++ 11中有几个具有不同名称的演员,并且使用它们被认为是好习惯,因为通过这样做你明确地表达了你想要做的事情.在您的情况下,您可能需要两种不同的东西中的一种
将指向int的指针转换为指向double的指针,这意味着除了告诉编译器它可以安全地假设指向的数据可以被视为double之外什么都不做.编译器将这样做,并且您有责任确保它是这种情况.这种类型的演员被认为是最危险的,因为众所周知,程序员是不可信任的.它被称为reinterpret_cast:
int* p_int = 2;
Foo* p_foo = reinterpret_cast<int>(p_int);
Run Code Online (Sandbox Code Playgroud)
与上面相同的代码,但我们在可怕的"reinterpret_cast"中表达了危险.p_int和p_foo具有相同的值,除了表达我们现在将整数的地址视为foo的地址这一事实外,我们什么也没做.
如果你想要一个真正的演员,你必须操作数据,而不是指针.通过编译器知道的任何方式将一种数据转换为另一种数据称为static_cast.这可能是你想要做的:
int i = 2;
p_int = &i;
double d = static_cast<double>(i);
p_double = &d; //p_int and p_double have different values since they point to different objects.
Run Code Online (Sandbox Code Playgroud)
编译器将查找从int到double的转换函数,如果找不到,则会对你大喊大叫.
当然,通过仅使用指针来完成相同的操作没有任何问题,尽管它使代码的可读性稍差(你应该谨慎使用指针,并且有充分的理由这样做):
int* p_i = 2;
int* p_d = static_cast<double>(*p_i) // p_d is a pointer to a double initialized to the value obtained after converting the int pointed to by p_i
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
146 次 |
| 最近记录: |