C 语言 void 指针

17 Mar 2025 | 4 分钟阅读

到目前为止,我们已经学过,分配给指针的地址应与指针声明中指定的类型相同。例如,如果我们声明一个int指针,那么这个int指针不能指向float变量或其他类型的变量,即它只能指向int类型的变量。为了解决这个问题,我们使用void指针。void指针意味着一个通用指针,可以指向任何数据类型。我们可以将任何数据类型的地址赋给void指针,并且一个void指针可以赋给任何类型的指针,而无需执行任何显式的类型转换。

void指针的语法

void指针的声明如下

在上面的声明中,void是指针的类型,'ptr'是指针的名称。

让我们来看一些例子

int i=9;         // 整型变量初始化。

int *p;         // 整型指针声明。

float *fp;         // 浮点型指针声明。

void *ptr;         // void指针声明。

p=fp;         // 不正确。

fp=&i;         // 不正确

ptr=p;         // 正确

ptr=fp;         // 正确

ptr=&i;         // 正确

C语言中void指针的大小

C语言中void指针的大小与字符类型指针的大小相同。根据C语言的观念,void指针的表示与字符类型指针的表示是相同的。指针的大小会根据您使用的平台而有所不同。

让我们看下面的例子

输出

void pointer in C

void指针的优点

以下是void指针的优点

  • malloc()和calloc()函数返回void指针,因此这些函数可以用来分配任何数据类型的内存。

输出

void pointer in C
  • C语言中的void指针也可以用来实现C语言中的泛型函数。

关于void指针的一些要点是

  • 在C语言中解引用void指针

C语言中的void指针不能被直接解引用。让我们看下面的例子。

在上面的代码中,*ptr是一个指向整型变量'a'的void指针。我们已经知道void指针不能被解引用,所以上面的代码会产生编译时错误,因为我们直接打印了指针'ptr'所指向的变量的值。

输出

void pointer in C

现在,我们重写上面的代码来消除错误。

在上面的代码中,我们通过使用下面的语句将void指针类型转换为整型指针

(int*)ptr;

然后,我们通过使用下面的语句打印void指针'ptr'所指向的变量的值

*(int*)ptr;

输出

void pointer in C
  • 对void指针的算术运算

我们不能直接在C语言中对void指针应用算术运算。我们需要应用适当的类型转换,以便我们可以对void指针执行算术运算。

让我们看下面的例子

上面的代码显示了编译时错误“void表达式的无效使用”,因为我们不能直接对void指针应用算术运算,即ptr=ptr+1。

让我们重写上面的代码来消除错误。

上面的代码成功运行,因为我们对void指针应用了适当的类型转换,即(float*)ptr,然后我们应用了算术运算,即*((float*)ptr+i)。

输出

void pointer in C

我们为什么使用void指针?

我们使用void指针是因为它的可重用性。Void指针可以存储任何类型的对象,我们可以通过使用带有适当类型转换的间接运算符来检索任何类型的对象。

让我们通过一个例子来理解。

输出

void pointer in C
下一个主题C语言解引用指针