📅  最后修改于: 2023-12-03 14:40:25.573000             🧑  作者: Mango
在C和C++中,“void *”表示一个指向任意类型的指针。它可以被用来传递指针,但是不能被解引用。虽然在C和C++中的“void *”的概念相同,但有一些区别在这两个语言中如下:
在C中,“void *”常常被用作类型不定指针, 并被用于某些函数库,如malloc()和qsort()。例如,在malloc()函数中,“void *”表示分配的内存区域。通常情况下,由于C程序员手动管理内存,因此使用“void *”来传递指针是很常见的。以下是一个简单的C程序片段,使用“void *”来传递指针参数:
#include <stdio.h>
void foo(void *ptr);
int main()
{
int x = 10;
foo(&x);
return 0;
}
void foo(void *ptr)
{
int *val = (int *) ptr;
printf("%d\n", *val);
}
在C中,“void *”需要类型转换被解引用。
C++中的void *的使用与C类似。除了能够传递指针外,“void *”还可以作为参数传递到函数中,并返回未知类型的指针。与C不同的是,C++有函数重载概念。因此,“void *”可能被用来overload一个函数,其签名不能匹配其它重载函数。以下是一个简单的C++程序片段,使用“void *”来传递和返回未知类型的指针参数:
#include <iostream>
using namespace std;
void * foo(void *ptr);
int main()
{
int x = 10;
char c = 'a';
int *ptr = (int*) foo(&x);
cout << *ptr << endl;
char *ret = (char*) foo(&c);
cout << *ret << endl;
return 0;
}
void * foo(void *ptr)
{
return ptr;
}
在C++中,“void *”要求进行类型转换才能被解引用。由于类型转换可能会带来未定义行为,在使用“void *”时需要谨慎。