void *
是一个通用指针,但是呢void **
?是void **
也一个通用的指针?
我们可以强制转换void **
到int **
,char **
等等.
我会感谢堆栈溢出系列的任何信息.
Que*_*tin 19
不是void**
指针void*
,而不是别的.只是void*
像通用指针一样.
请注意,实际尝试它可能会产生一致的结果,但只有标准规定了上述内容,其他任何内容都是未定义的行为,可能会毫不留情地崩溃.
void**
是一个指针void*
.除了它是未定义的行为(虽然可怕,行为通常由您的编译器定义),如果您执行以下操作,这也是一个巨大的问题reinterpret_cast
:
int x = 3;
char c = 2;
int* y = &x;
void* c_v = &c; // perfectly safe and well defined
void** z = reinterpret_cast<void**>(&y); // danger danger will robinson
*z = c_v; // note, no cast on this line
*y = 2; // undefined behavior, probably trashes the stack
Run Code Online (Sandbox Code Playgroud)
指针的指针是非常不同的指针.指针上相对安全的类型更改对指针的指针不安全.
使 ** 通用指针无效?
void **
不是通用指针。标准只说即将void *
成为一个通用指针。
关于指针指针和内存分配的一个观点:尽管由
void *
返回的类型malloc
是通用指针,适用于分配给任何类型的指针或从任何类型的指针分配,但假设类型void **
不是指向指针的通用指针。
我们可以将类型转换
void **
为int **
,char **
等等。
不,你不应该。
C-FAQ说:
C 中没有通用的指针到指针类型。
void *
仅用作通用指针,因为在将其他指针类型分配给和来自void *
'时会自动应用转换(如果需要);如果尝试间接void **
指向指向除void *
. 当您使用的void **
指针值(例如,当您使用*
运营商访问void *
到的值void **
点),编译器无法知道是否该方式void *
价值一度从其他指针类型转换。它必须假设它只不过是一个void *
; 它不能执行任何隐式转换。换句话说,您使用的任何
void **
值都必须是void *
某处实际值的地址;像 那样的强制转换(void **)&dp
,虽然它们可能会关闭编译器,但它们是不可移植的(甚至可能无法执行您想要的操作;另见问题 13.9)。如果指向的指针void **
不是 avoid *
,并且它的大小或表示形式与 a 不同void *
,那么编译器将无法正确访问它。