void的字面意思是"无类型",void *
则为"无类型指针",void *
可以指向任何类型的数据
void含义
void几乎只有注释和限制程序的作用,定义一个void变量没有意义
void的真正作用在于
- 对函数返回的限定
- 对函数参数的限定
在C语言中,void *
可以接受任意类型指针的赋值,而不需要进行内存强制转换
void *p1;
int *p2;
p1 = p2;
但这并不意味着,void *
也可以无需强制类型转换地赋给其它类型的指针。因为无类型可以包容有类型,而有类型则不能包容无类型。以下语句在编译时候就会报错
void *p1;
int *p2;
p2 = p1;
void的理解
如果函数没有返回值,那么应声明为void类型
在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回int类型值处理
但在实际编程中,为了代码的可阅读和可维护,无返回值的时候要加上void
如果函数无参数,那么应声明其参数为void
虽然很多时候,在函数没有参数的时候,需要加上void
在C有的编译器中,如果不添加void,那么此函数会接受任意类型参数
所以,在函数不接受任何参数的时候要用void进行说明
小心使用void指针类型
在不同的C标准中,处理void指针的算法操作有着不一样的宽容度
ANSI认为,一切对void指针的运算操作都是非法的,会报错
而GNU则认为,void指针的算法操作和char *
保持一致
为何兼容二者的思想,一般会对void指针进行转化,然后再对其操作
void * pvoid;
(char *)pvoid++; //ANSI:正确;GNU:正确
(char *)pvoid += 1; //ANSI:错误;GNU:正确
如果函数的参数可以是任意类型指针,那么应声明其参数为void *
典型的如内存操作函数memcpy和memset的函数原型分别为:
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
任何类型的指针都可以传入memcpy和memset中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型
这两个函数的返回值也是void *
void不能代表一个真实的变量
void代表了一种抽象,而不是实实在在存在的变量
因此,不能定义一个void变量
void的使用
数据类型的封装
int InitHardEnv(void **handle);
典型的如内存操作函数memcpy和memset的函数原型分别为
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
void修饰函数返回值和参数,仅表示无
如果函数没有返回值,那么应该将其声明为void型
如果函数没有参数,应该声明其参数为void
int function(void)
{
return 1;
}
void指针的意义
C语言规定只有相同类型的指针才可以相互赋值
void*
指针作为左值用于接收任意类型的指针
void*
指针作为右值赋值给其它指针时需要强制类型转换
int *p1 = NULL;
Char *p2 = (char *)malloc(sizoeof(char) * 20);
不存在void类型的变量
C语言没有定义void究竟是多大内存的别名