一、总述
二、分述
(1)void类型
void为什么无法用来定义变量?
(1)void修饰函数返回值
(2)void指针类型(作用:通常用来设计通用接口)
三、需要注意的代码
代码1
代码2
void 声明函数无返回值或无参数,声明无类型指针
void无法用来定义变量,因为不确定该开辟多少空间。在vs中,sizeof(void)的结果是0,在linux中用sizeof(void)结果是1,void无法用来定义变量的原因除了内存空间大小不确定之外,更重要的原因就是vlid类型本身就被编译器解释为空类型,所以编译器就强制的不允许用其来定义变量。
定义变量的本质就是开辟空间 而void作为空类型,理论上是不应该开辟空间的,即使开了空间,也仅仅作为一个占位符看待,所以,既然无法开辟空间,那么也就无法作为正常变量使用,既然无法使用,编译器干脆不让他定义变量。同样的,也无法通过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中)
}
注意:void*是可以定义变量的,因为指针占据的内存大小是明确的。
应用:void可以被任何类型的指针接收,同时void可以接收任意指针类型(常用),在库函数中,系统的接口设计上 ,尽量设计成通用接口,从而就收各种类型的数据,例如memset()函数。
#include<stdio.h>
int main()
{
void *p =NULL;
p++;
p--;
//上面这两种写法,编译器均会报错,因为不明确++或者--应该跨越的步长,换言之,如果想进行类似的++或者--操作
//就需要明确指针指向的变量类型所占据的内存空间的大小,之前已经指出,void在vs中所占据的内存空间大小为0.且
//无法被用来定义变量,所以自然无法用来进行++--的操作,但是在linux中是可以运行的,因为linux中明确了void
//类型的大小为1。
}
*注意: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;
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/m0_57304511/article/details/121525689
内容来源于网络,如有侵权,请联系作者删除!