C++ 取消引用时如何将空指针强制转换为指针?

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指针的空指针。当我想要取消引用时,正确地转换void指针的语法是什么?上述代码将退出:

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));
}