void关键字
void的字面意思是“空类型”,void*指针为空类型指针,void*可以指向任意类型的数据。
注:void定义的变量或指针为空或者是指向空,但并不是没有。
一般在程序中,void只有注释或限制程序的作用;
void 真正发挥的作用在于:
(一)对函数返回的限定。
(二)对函数参数的限定。
一.void a; ???
我们都知道,如果指针a1和a2具有相同的类型,那么它们之间可以直接相互赋值;如果a1和a2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型强制转换为左边的指针类型。例如:
int* a1;
float* a2;
a2 = a1;
编译时,a2 = a1会编译出错,必须改为:
a2 = (float*)a1;
而void不同,任何类型的指针都可以赋值给它,无需强制转换。
void* a1;
int* a2;
a1 = a2;
此时编译不会出错。但并不意味着void*也可以无需强制转换地赋值给其他类型,因为空类型也是一种类型,“空类型”可以包容“有类型”,但“有类型”不能包含“空类型”。例如:
void* a1;
int* a2;
a2 = a1;
此时编译会出错。
二.void修饰函数返回值和参数:
C语言有规则:如果函数无返回值或无参数,则应声明为void类型。
在C语言中凡是不加返回值类型类型限定的函数,编译器默认其返回值为整型处理。注意:是整型而不是很多人认为的void型。所以,为了防止混乱,我们再编写C程序是,对于任何函数都必须一个不漏的指定其类型,没有返回值的函数一定要声明为void类型;这既是程序的良好可读性,也是程序编写规范的要求。另外,对于无参数传递的函数,应在函数名后面的括号内声明为void类型。
三.void指针
按照ANSI标准,不能对void类型指针进行算法操作,即下列操作时不合法的:
void* P;
P++;
P += 1;
因为,在ANSI标准中规定,进行算法操作的指针必须是确切知道其的指向数据类型大小的,也就是说必须知道内存地址的确切值。
还有另一条规则是:如果函数的参数可以是任意类型的指针,那么可以将其声明为void型。
四.Void不能代表一个真实的变量
定义变量时,必须分配内存空间,定义void型变量时,编译器到底分配多大的内存呢?
在C语言中,
void* P;
printf("%d\n"sizeof(p));
编译时会报错。
其实,void的出现只是一种抽象的需要。