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 

指针的指针是非常不同的指针。 指针上相对安全的类型更改对指针指针不安全。