为什么 &(void *) 和 void** 不兼容?
在C语言中,指针是一种非常重要的数据类型,它允许我们直接访问内存中的数据。指针有不同的类型,而不同类型的指针在内存中占用的空间大小和解引用方式都有所不同。在C语言中,我们使用指针来传递参数、返回值和操作内存等。然而,在C语言中,我们会遇到一些类型之间不兼容的情况。其中一个例子就是 &(void *) 和 void**。为了了解为什么它们不兼容,我们需要先了解一下它们的定义和特性。首先,让我们来看一下 &(void *) 的定义。&(void *) 表示一个指向指针的指针的地址。换句话说,它是一个指向指针的指针的指针。在C语言中,我们可以通过使用 & 运算符来获取一个变量的地址。对 &(void *) 进行解引用操作将得到一个指向指针的指针。接下来,让我们来看一下 void** 的定义。void** 表示一个指向指针的指针。换句话说,它是一个指向指针的指针。在C语言中,我们可以通过使用 * 运算符来解引用一个指针,获取指针所指向的值。为什么它们不兼容?现在我们来解释一下为什么 &(void *) 和 void** 不兼容。在C语言中,不同类型的指针在内存中占用的空间大小和解引用方式都有所不同。&(void *) 表示一个指向指针的指针的地址,而 void** 表示一个指向指针的指针。尽管它们都是指向指针的指针,但是它们的类型不同,因此它们在内存中占用的空间大小和解引用方式也不同。具体来说,&(void *) 的类型是 void***,它是一个指向指针的指针的指针。而 void** 的类型是 void**,它是一个指向指针的指针。虽然它们都指向指针,但是它们的类型不同,因此它们的内存布局也不同。所以,当我们尝试将 &(void *) 赋值给 void** 时,编译器会给出错误提示,因为它们的类型不兼容。案例代码:下面是一个简单的示例代码,用于说明 &(void *) 和 void** 不兼容的问题:c#include int main() { int num = 10; int *ptr = # int **ptr_ptr = &ptr; void *void_ptr = (void *)ptr; printf("num: %d\n", num); // 输出 10 printf("*ptr: %d\n", *ptr); // 输出 10 printf("**ptr_ptr: %d\n", **ptr_ptr); // 输出 10 // 错误示例:尝试将 &(void *) 赋值给 void** void **void_ptr_ptr = &(void_ptr); // 编译错误 return 0;}
在上面的代码中,我们定义了一个整数变量 num,并创建了一个指向 num 的指针 ptr,以及一个指向指针 ptr 的指针 ptr_ptr。然后,我们将 ptr 转换为 void* 类型,并尝试将 &(void *) 赋值给 void**,这会导致编译错误。:在C语言中,指针是一种重要的数据类型,它允许我们直接访问内存中的数据。然而,不同类型的指针在内存中占用的空间大小和解引用方式都有所不同。因此,当我们遇到不同类型的指针时,如 &(void *) 和 void**,它们是不兼容的。了解这些不兼容性对于编写正确的C代码非常重要,以避免出现潜在的错误和问题。