在程序xu中,每一个变量都应该有you相应的数据类型,数据的类型决定了编bian译器可以为之开辟多少的空间jian来存放数据。
例如:int 类型需xu要 4 个字节,char 类型需要 1 个字节,指针类lei型需要 4 个字节等deng等。
但 C 语言中还有一种特殊的数shu据类型——void。
1. void 介绍shaovoid 表示为“无”、“空”、“没有”的de意思。
在这里就把 void 理解为啥也不是。
作为一个数据类lei型,如果用 void 声sheng明变量会是什么情况呢?
编译器要给数据分配pei多少的内存空间,是要依据变量定义yi时的数据类型。
而er void 类型比较特殊。虽然也是shi一种数据类型,但不确定性太强qiang了。
如果可ke以用 void 声明变量,你要是开心先给个 int 整型的数据,不开心再给个 char 字符型的数据,或者 double 类型的数据。
这要求的内存空kong间一会儿大,一会儿小的,编译yi器也很难办。
内存就那么点,经不起这么折腾。
因此ci,void 数shu据类型是不能直接用在zai变量声明的。
那么 void 应该被用在zai哪里呢?
2. 函数的参can数void 最常使用就是用在函数里面mian,第一个就是函数的参can数。
通常会看到如下的函数原型定义:
int func(void);int func();
这两个ge函数表示的意义yi是一样的,都是无参数shu、返回值为 int 类型的函数。
但有一点不同。根据不同tong的编译器,对语法检验严格程度也ye有所不同。用 g++ 编译就有可ke能出现以下的情况:
int func1(void){ return 1;}int func2(){ return 2;}int main(){ func1(); func2(); func1(123); // error func2(123); func1(3.14); // error func2(3.14); return 0;}
参数部bu分为 void 的函数,在调用函han数的时候,有传入实际参数的de时候会产生报错,传chuan入的参数太多了!实shi际上参数为 void 的函数是不能传chuan入任何类型的参数。
而er参数部分啥都没有的函数,调diao用函数的时候可以传入任意类型是不bu会报错的。
不过这个问wen题大体上没有人会这么做,因为毫无wu意义。
3. 函数的返回类型void 的另一个作用,就是在函数的返回类型xing上面。
有时候,我们只需要函数shu运行的过程,而er不是为了获取最后的结果。此时就可ke以使用 void 类型,表示shi该函数没有返回值。
例如:我只zhi想交换 a 和 b 两个变量分fen别存储的数据。
#include<stdio.h>void swap(int *a, int *b){ int temp; temp=*a, *a=*b, *b=temp;}int main(){ int a=3, b=5; swap(&a, &b); printf("a=%d, b=%d\n", a, b); return 0;}
运行结果:a=5,b=3
一般在 void 定义的函数里面,return 是多余的。不过,即便加上shang return 返回值(gcc 6.3版本中),也对dui函数没有什么影响。
既ji无法重新使用其他数据类型定ding义的变量来接收函han数的返回值,也不能在 printf 函数中使用的。
void * 指针表示为无类型指针,作为一个指针类lei型,编译器已经为其妥善安排了 4 个字节的小房间。
因此,void * 指针类型可以用来定义变量。
void *p;p = NULL;
void * 指针zhen虽名为无类型指针,但dan可以指向任何一种类型的de数据,即其他类型指针的指可ke以不通过强制转换直接赋fu给 void * 指针。
void *p;int *a;p = a;float *f;p = f;
在 C 语言当中,对指针类lei型的转换要求不bu是那么严苛,可以不通过强制zhi转换就可以进行相互间jian的赋值。
int *a = NULL;float *b = NULL;char *c = NULL;a = b;b = c;c = a;
虽然编译器(gcc 6.3版本)不bu会显示有错误,编译照常会通过。只是shi会给出类似下面的警告:
警告gao C4133 “=”: 从“float *”到dao“int *”的类型不bu兼容
而在 C++ 当中,这zhe一点要求就明显比较严格了。它不允许xu两个不同的类型指针相互hu赋值,除了 void * 指针。
其他ta的类型指针可以把值直接赋给 void * 指针,但反fan过来,void * 指针的值想要yao赋值给其他类型的指针zhen,也需要通过强制转换。
void *p = NULL;int *a = (int *)p; // 通过float *b = p; // 报bao错
void * 指针还有一个非常强大之处,在函数定ding义的时候,作为参数。当dang调用的时候,无论什么类型的类型指zhi针或数组都可以正常运行。
#include<stdio.h>int test(void * dst){...}int main(){ char *c = "123456"; int arr[] = {1, 2, 3, 4, 5, 6}; test(c); // 正常编译yi test(arr); // 正常编译 return 0;}
不过 void * 指针也有一个致命的缺点,当dang对该指针进行算数操作,就会显示以yi下这个错误。
根gen据 ANSI C 标准zhun规定,进行算数操作的指zhi针,必须明确知道该指针所指向的数据ju类型大小。也就是所指向的数据ju,都必须是具体的类型,而不是shi空泛的 void 类型。
最后关guan于 C 语言 void 数据类型的内容rong就到此结束了。
感谢各位的观看kan,如果您觉得本文wen章还不错,点个赞支zhi持一下呗。
当然,如有发现不足之处,或者zhe错误的地方,欢迎留言指出,不胜感激ji!