📜  C和C++中的“ void *”有何区别?(1)

📅  最后修改于: 2023-12-03 14:40:25.573000             🧑  作者: Mango

C和C++中的“void *”有何区别?

在C和C++中,“void *”表示一个指向任意类型的指针。它可以被用来传递指针,但是不能被解引用。虽然在C和C++中的“void *”的概念相同,但有一些区别在这两个语言中如下:

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类似。除了能够传递指针外,“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 *”时需要谨慎。