网站建设的相关问题,适合年轻人开的工作室,网站如何做3d产品,汽车维修保养网站模板作者#xff1a;小树苗渴望变成参天大树 作者宣言#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 #xff0c;就 给 作 者 点 点 关 注 吧#xff01; void前言一、 void 关键字二、 void修饰函数返回值和参数三、void指针3.1void * 定义的… 作者小树苗渴望变成参天大树 作者宣言认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 就 给 作 者 点 点 关 注 吧 void前言一、 void 关键字二、 void修饰函数返回值和参数三、void指针3.1void * 定义的指针变量可以进行运算操作吗3.2void * 用来设计通用接口四、总结前言
我相信再大家潜意识里对void的理解解释空类型的意思吧觉得void的作用并不是那么的多这篇博客让你充分认识到void的含义以及作用 一、 void 关键字
void通俗的来说和其他的数据类型世同级的但是void关键字的用法非常多他也有一些做不到的事情。 void是否可以定义变量? #include stdio.h
#include windows.h
int main()
{
void a;
system(pause);
return 0;
}运行结果 我们看到void是定义不了变量的我们知道用数据类型定义变量是为其分配多大的空间而类型的大小就起到开辟多大空间的作用那让我们来看看void的大小是多少 这下我们知道为什么void定义不了变量了吧这是再vs2019上看到的结果那我们再vscode的gcc编译器看看结果
我们看到再gcc编译器上的void的大小是1为什么还是不可以定义变量呢 void本身就被编译器视为空类型强制的不允许定义变量 总结为何 void 不能定义变量 定义变量的本质开辟空间 而void作为空类型理论上是不应该开辟空间的即使开了空间也仅仅作为一个占位符看待所以既然无法开辟空间那么也就无法作为正常变量使用既然无法使用编译器干脆不让他定义量。
二、 void修饰函数返回值和参数
场景1void用来作为函数返回值
test()
{;
}
int main()
{int a test();printf(%d, a);system(pause);return 0;
}我们看到函数不用返回值是正确的并且默认返回的int类型的不用void会让程序员不知道你是没有返回值还是返回int类型那void的好处是什么呢1.占位符让用户明确不需要返回值。2.告知编译器返回值无法接收
场景2void 作为函数参数 我们先来看一个代码不带参数的函数传参
void test()//默认不要参数
{;
}
int main()
{test(2,5,niaho);system(pause);return 0;
}这样的代码并不会出现错误原因是你传进去但没有东西接收 void test(void)//明确告诉你不要参数
{;
}
int main()
{test(2,5,niaho);system(pause);return 0;
}这样就会报错明确说不用参数你传参就会报错 结论 1.如果一个函数没有参数将参数列表设置成void是一个不错的习惯因为可以将错误明确提前发现 2.另外阅读你代码的人也一眼看出不需要参数。相当于自解释
题外话尽管如此如果这点你不习惯也不勉强。
三、void指针
void不能定义变量那么void*呢
#include stdio.h
#include windows.h
int main()
{void* p NULL; //可以system(pause);return 0;
}我们看到可以通过并且没有报警为什么void可以呢因为void是指针是指针空间大小就能明确出来 我们再来看看void*有那些特性
#include stdio.h
#include windows.h
int main()
{
void *p NULL;
int *x NULL;
double *y NULL;
p x; //虽然类型不同但是编译器并不报错
p y; //同上
xp;
yp
system(pause);
return 0;
}我们看到编译器叶没有报错我们可以得出如下结论 1.void的作用是用来接受任意指针类型的。 2.任意指针也可以接受void类型的。 这块在后面如果想设计出通用接口很有用例如
/void * memset ( void * ptr, int value, size_t num );3.1void * 定义的指针变量可以进行运算操作吗
我们上面介绍了void可以定义指针变量我们知道指针变量是可以进行运算操作的那void*的指针可以进行运算操作吗我们一起来看看
NULL实际就是在0进行强转变成void*类型
#include stdio.h
#include windows.h
int main()
{
void *p NULL;
p; //报错
p 1; //报错
system(pause);
return 0;
}我们之前在指针那一节说过指针运算的大小和类型有关例如int的类型加1就跳过一个整型那么void在vs2019上不知道大小的自然加1是不知道的所以会报错。
那让我们来看一下gcc编译器上的结果吧 我们看到gcc编译器上可以通过原因是在gcc编译器的void大小为1又了固定的大小
3.2void * 用来设计通用接口
对于一个函数我们需要接受的类型可能不一样这时候就需要用void*作为接口来实现这里我不在具体介绍那些是需要接口的例子大家可以看我之前谢的关于有接口的例子 qsort 内存操作函数
四、总结
通过这篇博客我希望大家对void的类型的含义和用法又有了更深的理解这篇的难度不大只是为了拓展我们的知识面希望能够版主到大家今天我们就说到这里我们下篇再见