C++ 取消引用时如何将空指针强制转换为指针?
我有一个指向int指针的空指针。当我想要取消引用时,正确地转换void指针的语法是什么?上述代码将退出:C++ 取消引用时如何将空指针强制转换为指针?,c++,c,pointers,void-pointers,C++,C,Pointers,Void Pointers,我有一个指向int指针的空指针。当我想要取消引用时,正确地转换void指针的语法是什么?上述代码将退出: int x = 5; int *xPtr = &x; void **xPtrPtr = &xPtr; printf("%d\n", *(int*)*xPtrPtr); 谢谢大家! 指向int的指针是*((int**)xPtrPtr)指向int的指针是*((int**)xPtrPtr) ideone的代码: ideone的代码:对于空指针,您实际上不需要知道有多少间接指令 5
int x = 5;
int *xPtr = &x;
void **xPtrPtr = &xPtr;
printf("%d\n", *(int*)*xPtrPtr);
谢谢大家! 指向int的指针是
*((int**)xPtrPtr)
指向int的指针是*((int**)xPtrPtr)
ideone的代码:
ideone的代码:对于空指针,您实际上不需要知道有多少间接指令
5
.对于void指针,您实际上不需要知道有多少间接寻址
5
.这将正确编译:
x = 5
x = 5
#包括
int main(int argc,char*argv[]){
int x=57;
int*xPtr=&x;
void**xPtrPtr=(void**)和xPtr;
printf(“%d\n”,*((int*)*xPtrPtr));
}
这可以正确编译:
x = 5
x = 5
#包括
int main(int argc,char*argv[]){
int x=57;
int*xPtr=&x;
void**xPtrPtr=(void**)和xPtr;
printf(“%d\n”,*((int*)*xPtrPtr));
}
分配时不能强制转换吗?->void**xPtrPtr=(void)&xPtr;你为什么要选演员?多了解一些情况有助于回答这个问题。外部函数是否需要void**
?分配时不能强制转换吗?->void**xPtrPtr=(void)&xPtr;你为什么要选演员?多了解一些情况有助于回答这个问题。您是否需要外部函数的void**
?感谢您向我展示了“重新解释强制转换”的概念。在上面提到的问题中,最简单的答案是,当涉及无效指针时,我不需要知道间接指示的级别。@Christian:我认为这样说是不好的。指向任何对象的指针(包括指向指针的指针或指向指针的指针等)可以存储在空指针中,然后可以转换回原始指针类型。另外请注意,这仅适用于指向对象的指针(不适用于指向函数的指针或指向成员的指针)。在上面提到的问题中,最简单的答案是,当涉及无效指针时,我不需要知道间接指示的级别。@Christian:我认为这样说是不好的。指向任何对象的指针(包括指向指针的指针或指向指针的指针等)可以存储在空指针中,然后可以转换回原始指针类型。请注意,这只适用于指向对象的指针(不是指向函数指针或指向C++成员)。虽然我仍然说,如果这是C++,你应该使用C++的构造,包括C.代码> > RealTycType(PV)< /C> >杰夫:你说的对,只是因为我的C++版本太冗长,所以总是懒惰的我做C++风格的演员。虽然我仍然说,如果这是C++,你应该使用C++的构造,包括C.代码> > RealTycType(PV) @杰夫:你说的对,只是懒惰的我总是做C样式的转换,因为C++版本太冗长了。
#include <iostream>
int main(void){
int x = 5;
int* pX = &x;
void* pV = &pX;
std::cout << "x = " << **(int**)pV << std::endl;
// better use C++-Style casts from the beginning
// or you'll be stuck with the lazyness of writing the C-versions:
std::cout << "x = " << **reinterpret_cast<int**>(pV) << std::endl;
std::cin.get();
}
x = 5
x = 5
#include <stdio.h>
int main(int argc, char *argv[]) {
int x = 57;
int *xPtr = &x;
void **xPtrPtr = (void**)&xPtr;
printf("%d\n", *((int*)*xPtrPtr));
}