布条百科 - 专业百科知识分享的网站 手机版
首页 > 生活 >

详解 void在c语言中什么意思

378次浏览     发布时间:2023-03-11 15:30:08    

在程序中,每一个变量都应该有相应的数据类型,数据的类型决定了编译器可以为之开辟多少的空间来存放数据。

例如:int 类型需要 4 个字节,char 类型需要 1 个字节,指针类型需要 4 个字节等等。

但 C 语言中还有一种特殊的数据类型——void。

1. void 介绍

void 表示为“无”、“空”、“没有”的意思。

在这里就把 void 理解为啥也不是。

作为一个数据类型,如果用 void 声明变量会是什么情况呢?

编译器要给数据分配多少的内存空间,是要依据变量定义时的数据类型

而 void 类型比较特殊。虽然也是一种数据类型,但不确定性太强了。

如果可以用 void 声明变量,你要是开心先给个 int 整型的数据,不开心再给个 char 字符型的数据,或者 double 类型的数据。

这要求的内存空间一会儿大,一会儿小的,编译器也很难办。

内存就那么点,经不起这么折腾。

因此,void 数据类型是不能直接用在变量声明的

那么 void 应该被用在哪里呢?

2. 函数的参数

void 最常使用就是用在函数里面,第一个就是函数的参数

通常会看到如下的函数原型定义:

int func(void);int func();

这两个函数表示的意义是一样的,都是无参数、返回值为 int 类型的函数。

但有一点不同。根据不同的编译器,对语法检验严格程度也有所不同。用 g++ 编译就有可能出现以下的情况:

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;}

参数部分为 void 的函数,在调用函数的时候,有传入实际参数的时候会产生报错,传入的参数太多了!实际上参数为 void 的函数是不能传入任何类型的参数。

而参数部分啥都没有的函数,调用函数的时候可以传入任意类型是不会报错的。

不过这个问题大体上没有人会这么做,因为毫无意义。

3. 函数的返回类型

void 的另一个作用,就是在函数的返回类型上面。

有时候,我们只需要函数运行的过程,而不是为了获取最后的结果。此时就可以使用 void 类型,表示该函数没有返回值

例如:我只想交换 a 和 b 两个变量分别存储的数据。

#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 是多余的。不过,即便加上 return 返回值(gcc 6.3版本中),也对函数没有什么影响。

既无法重新使用其他数据类型定义的变量来接收函数的返回值,也不能在 printf 函数中使用的


4. void *指针

void * 指针表示为无类型指针,作为一个指针类型,编译器已经为其妥善安排了 4 个字节的小房间。

因此,void * 指针类型可以用来定义变量。

void *p;p = NULL;

void * 指针虽名为无类型指针,但可以指向任何一种类型的数据,即其他类型指针的指可以不通过强制转换直接赋给 void * 指针

void *p;int *a;p = a;float *f;p = f;

在 C 语言当中,对指针类型的转换要求不是那么严苛,可以不通过强制转换就可以进行相互间的赋值。

int *a = NULL;float *b = NULL;char *c = NULL;a = b;b = c;c = a;

虽然编译器(gcc 6.3版本)不会显示有错误,编译照常会通过。只是会给出类似下面的警告:

警告 C4133 “=”: 从“float *”到“int *”的类型不兼容

而在 C++ 当中,这一点要求就明显比较严格了。它不允许两个不同的类型指针相互赋值,除了 void * 指针。

其他的类型指针可以把值直接赋给 void * 指针,但反过来,void * 指针的值想要赋值给其他类型的指针,也需要通过强制转换。

void *p = NULL;int *a = (int *)p; // 通过float *b = p; // 报错

void * 指针还有一个非常强大之处,在函数定义的时候,作为参数。当调用的时候,无论什么类型的类型指针或数组都可以正常运行。

#include<stdio.h>int test(void * dst){...}int main(){  char *c = "123456";  int arr[] = {1, 2, 3, 4, 5, 6};  test(c);  // 正常编译  test(arr);  // 正常编译  return 0;}

不过 void * 指针也有一个致命的缺点,当对该指针进行算数操作,就会显示以下这个错误。

根据 ANSI C 标准规定,进行算数操作的指针,必须明确知道该指针所指向的数据类型大小。也就是所指向的数据,都必须是具体的类型,而不是空泛的 void 类型。

最后

关于 C 语言 void 数据类型的内容就到此结束了。


相关文章

鱼头泡饭的家常做法(教你做“鱼头泡饭”,有秘诀)

鱼头是老百姓最喜欢吃的,尤其是胖头鱼的鱼头最好吃,味道鲜美,多吃鱼头增强记忆力,鱼头含有丰富的蛋白质,营养又健康。今天阿伟和大家分享一道湖北名菜,鱼头泡饭,下面看看做法吧!主料:胖鱼头,最好是四斤左右的,这样的鱼头最好吃。调料:小红辣椒30克,小青辣椒30克,仔姜20克,蒜米20克,精盐16克,胡椒

2025-02-06 06:55:52

咖喱鸡翅的做法简单(这道鸡翅味道鲜美、做法简单)

前几天分享了可乐鸡翅的做法,有小伙伴留言给我,说她特别爱吃鸡翅,但是苦于不会做饭,对各种调味料的掌握也都不太熟练,看到可乐鸡翅就特别开心,因为不需要太多调味料,如今她已经学会做了,还受到了家人的夸奖,所以她还想再学其它口味、不用太多调味品的鸡翅做法,希望我能继续分享。那么鸡翅还有什么方法做起来简单呢

2025-02-06 05:15:16

啤酒红烧黑鱼做法窍门(6道好吃的家常菜,做法简单)

天气渐渐变得寒冷起来,平常总想吃点热乎的饭菜,今天就给大家分享6道好吃的家常菜,有荤有素也有汤,做法简单,好吃解馋,即便逢年过节招待客人,也是非常受欢迎的菜品。一、【红烧肉】作为一道最为经典的家常菜,红烧肉可是老少皆宜的美味,一道好吃的红烧肉不仅要红亮诱人,而且要肥而不腻,瘦而不柴,那滋味真心令人欲

2025-02-06 04:52:39

烤麸怎么做好吃又简单(教你“四喜烤麸”家常做法)

四喜烤麸是非常经典的上海家常菜,诱人的颜色,醇厚的滋味,典型的上海咸甜味,所有材料充分吸收了汤汁的味道,美妙滋味不可言喻,酱红香醇,鲜香入味,口感有糯有脆,夹一筷入口,烤麸的毛孔全部打开,甜咸鲜的酱汁涌出,正是烤麸最感动味蕾的瞬间。食材准备烤麸750克干木耳20克花生米200克干金针菜20克生抽30

2025-02-06 01:48:40

鱿鱼炒洋葱的做法家常(鱿鱼最简单的吃法-爆炒鱿鱼)

今天给大家分享一道鱿鱼的吃法-爆炒鱿鱼这道爆炒鱿鱼香辣过瘾,真的巨好吃,简单易做,超下饭。鱿鱼,营养价值很高,富含人体必需的多种氨基酸,富含钙、磷、铁元素,利于骨骼发育和造血,能有效治疗贫血最近总是熬夜,用眼过多,视力感觉也不好了,网上了解了下,鱿鱼含有大量的牛黄酸,可抑制血液中的胆固醇含量,缓解疲

2025-02-06 00:51:09

花生酥的做法是什么(教你做小零食“花生酥”,新手看完也会!)

1、花生又名落花生、双子叶植物,叶脉为网状脉,种子有花生果皮包被。历史上曾叫长生果、地豆、落花参、落地松、成寿果、番豆、无花果、地果、唐人豆。花生长于滋养补益,有助于延年益寿,所以民间又称“长生果”,并且和黄豆一样被誉为“植物肉”、“素中之荤”。3、下面,开始介绍所需要食材:油炸脆皮花生米200克,

2025-02-05 06:06:31