目录
一、总述
二、分述
(1)void类型
void为什么无法用来定义变量?
(1)void修饰函数返回值
(2)void指针类型(作用:通常用来设计通用接口)
三、需要注意的代码
代码1
代码2
一、总述
void 声明函数无返回值或无参数,声明无类型指针
二、分述
(1)void类型
void为什么无法用来定义变量?
void无法用来定义变量,因为不确定该开辟多少空间。在vs中,sizeof(void)的结果是0,在linux中用sizeof(void)结果是1,void无法用来定义变量的原因除了内存空间大小不确定之外,更重要的原因就是vlid类型本身就被编译器解释为空类型,所以编译器就强制的不允许用其来定义变量。
定义变量的本质就是开辟空间 而void作为空类型,理论上是不应该开辟空间的,即使开了空间,也仅仅作为一个占位符看待,所以,既然无法开辟空间,那么也就无法作为正常变量使用,既然无法使用,编译器干脆不让他定义变量。同样的,也无法通过void进行强制类型转换。
(1)void修饰函数返回值
1、占位符,让用户明确不需要返回值
2、告知编译器没有返回值,即如果用户用变量接收返回值的话就会报错
3.void充当函数的形参列表:告知用户或者编译器,该函数不需要传参。
结论:如果一个函数没有参数,就在()内加上void;如果一个函数不需要返回值或者没有返回值,就在返回值类型处加上void。
int test1() { return 1; } int test2() { return 2; } int main() { test1(1,2,3,4);//编译器在vs上不会报错且不会有警告可以正常运行,在linux中一样可以正常编译。 test2(1,2,3,4);//编译器在vs上不会报错但会有警告可以正常运行,但是在linux中无法正常编译。 //上述两种情况对于传参时在栈区中开辟内存都没有任何的影响(在vs中) }
(2)void指针类型(作用:通常用来设计通用接口)
注意:void*是可以定义变量的,因为指针占据的内存大小是明确的。
应用:void*可以被任何类型的指针接收,同时void*可以接收任意指针类型(常用),在库函数中,系统的接口设计上 ,尽量设计成通用接口,从而就收各种类型的数据,例如memset()函数。
三、需要注意的代码
代码1
#include<stdio.h> int main() { void *p =NULL; p++; p--; //上面这两种写法,编译器均会报错,因为不明确++或者--应该跨越的步长,换言之,如果想进行类似的++或者--操作 //就需要明确指针指向的变量类型所占据的内存空间的大小,之前已经指出,void在vs中所占据的内存空间大小为0.且 //无法被用来定义变量,所以自然无法用来进行++--的操作,但是在linux中是可以运行的,因为linux中明确了void //类型的大小为1。 }
代码2
注意:C语言中无法对void *类型指针变量进行解引用,例如下面这段代码就会报错:
int main() { int a = 10; void * p = &a;//因为void类型的指针可以接收任意类型的数据的指针(地址) *p=20; printf("%d",*p); //这两段代码都会报错,p是void*类型的,对p解引用,*p就是指向指针所指向的目标或者说类型,对p解引用 //*p的类型就是void,而编译器无法通过void类型来解析其对应的空间及类型以及里面的数据,所以编译器会 //报错,在Linux中同样无法正常的运行。因为在vs和Linux中均无法用void来定义变量 return 0; }