Void **一个通用指针?
void *
是一个通用指针,但是void **
呢? void **
也是通用指针吗?
我们可以将void **
转换为int **
, char **
等等。
我会感谢堆栈溢出系列的任何信息。
不, void**
是一个指向void*
的指针,没有别的。 只有void*
就像一个通用指针。
请注意,实际尝试它可能会产生一致的结果,但只有标准规定了上述内容,其他任何内容都是未定义的行为,可能会毫不留情地崩溃。
Void **一个通用指针?
void **
不是通用指针。 标准说只有void *
是一个通用指针。
第22章:指针指针 :
关于指针和内存分配指针的一个观点:虽然
malloc
返回的void *
类型是一个通用指针,适合分配给任何类型的指针,但假设类型void **
不是通用指针指针。
我们可以将
void **
转换为int **
,char **
等等。
不,你不应该。
C-FAQ说:
C中没有通用的指针指针类型 。
void *
仅作为通用指针使用,因为当其他指针类型分配给void *
时会自动应用转换(如果需要); 如果尝试间接在指向void *
之外的指针类型的void **
值上,则无法执行这些转换。 当您使用void **
指针值时(例如,当您使用*
运算符访问void **
指向的void *
值时), 编译器无法知道该void *
值是否为一次从其他指针类型转换而来 。 它必须假设它只不过是一个void *
; 它无法执行任何隐式转换。换句话说, 您使用的任何
void **
值必须是某个地方的实际void *
值的地址; 类似于(void **)&dp
,虽然它们可能会关闭编译器,但它们是不可移植的 (甚至可能没有你想做的事情;另见问题13.9)。 如果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(&y); // danger danger will robinson *z = c_v; // note, no cast on this line *y = 2; // undefined behavior, probably trashes the stack
指针的指针是非常不同的指针。 指针上相对安全的类型更改对指针指针不安全。