C语言再学习 -- 关键字void
来源:互联网 发布:中国大数据时代 编辑:程序博客网 时间:2024/06/11 19:51
参看:C语言关键字
void 用途:
1、对函数返回的限定,用于强调函数没有返回值。如,void func(int x);2、对函数参数的限定,用于强调函数没有任何参数。如,int func(void);
3、指向void的指针。如 void *vp = NULL;
4、丢掉函数调用的返回值。如, int func(int x); (void)func(5);
5、(void)0,(void)1,(void *)0,(void*)0x100000
1、void
void对象的(不存在的)值不能够以任何方式使用,也不能被显式或隐式地转换为任一非空类型。因为void表达式表示一个不存在的值,这样的表达式只可以用在不需要值的地方,例如:作为一个表达式语句或作为逗号运算符的左操作数。(《C程序设计语言》 附录A.6.7)
1)不能被显式或隐式地转为任一非空类型
int x = 12, y = 0; y= (int)((void)x); // 错误:'type cast' : cannot convert from 'void' to 'int' y= (int)((void)123);//错误: 'type cast' : cannot convert from 'void' to 'int'
2)void 表达式只能用在不需要的地方
int x = 12, y = 0; (void)x;//正确:表达式语句 y = ((void)x, 123);//正确:逗号运算符的左操作数
3)定义void变量
void a;//是错误的,因为定义变量时必须分配内存空间,定义void类型变量,编译器不知该分配多大的内存空间。
4)将表达式强制转换为void类型
define min(x,y) ({ \ typeof(x) _x = (x); \ typeof(y) _y = (y); \ (void) (&_x == &_y); \ _x < _y ? _x : _y; })
(void)(&_x == &_y);其中&_x == &_y是关系表达式,如果关系为真,则表达式的结果值为数值1;如果为假,则结果值为数值0。故而,(void)(&_x == &_y);等价于(void)0;或(void)1;
int func(int x); void func(5);
(void)func(5);在表达式语句中一个空的强制类型转换将丢掉函数调用的返回值。
5)(void)0
标准库头文件:assert.h #define assert(test) ((test) ? (void)0 : _Assert(__FILE__“:”__STR(__LINE__)”” #test))
(void)0的作用相当于函数返回类型为void限定,它仅是一个占位符表达式,什么都不做。
2、指向void的指针
指向任何类型的指针都可以转为void *类型,且不会丢失信息。如果将结果再转换为初始指针类型,则可以恢复初始指针。
void *vp; char *cp; vp = cp; /*指向任何类型的指针都可以转为void *类型,且无需强制转换*/ cp = (char *)vp;
但是需要注意:“空类型”可以包容“有类型”,而“有类型”则不能包容“空类型”。
void *p1;int *p2;p2 = p1;C编译 是OK的C++编译出现 错误: 从类型‘void*’到类型‘int*’的转换无效 [-fpermissive]
1)#define NULL (void*)0
定义NULL为指向内存位置为0的空指针。
NULL表示内存位置0,NULL指针并不指向任何对象。因此除非是用于赋值或比较运算,出于其他任何目的使用NULL指针都是非法的
2)将整型数值转为指针
#define BUFFER_END 0x200000 void * b = (void *) BUFFER_END; if (b == (void *) 0x100000) b = (void *) 0xA0000;
指向特定类型的指针可以进行算术运算(+、-)和关系运算(==、!=、<、>、>=、<=),空类型指针不可以。
3、void修饰函数返回值和参数
如果函数没有返回值,那么应声明为 void 类型。在 C 语言中,凡不加返回值类型限定的函数,就会被编译器作为返回 整型值 处理,但是许多程序员却误认为其为 void 类型。
#include <stdio.h>void main (void){printf ("hello world!\n");return 0;}编译出现:警告: 在无返回值的函数中,‘return’带返回值 [默认启用]
#include <stdio.h>main (){printf ("hello world!\n");return 0;}编译OK
因此,为了避免混乱,我们在编写 C 程序时,对于任何函数都必须一个不漏地指定其类型,如果函数没有返回值,一定要声明为 void 类型。
再有,无论在 C 还是 C++中,若函数不接受任何参数,一定要指明参数为 void。
0 0
- C语言再学习 -- 关键字void
- C语言void关键字
- C语言关键字void
- C语言void关键字
- C语言关键字--- void exrern sizeof
- C语言再学习--关键字
- C语言再学习--关键字
- [C关键字]void 关键字
- Daily-C-Study(9):C语言void关键字
- C语言之关键字(二) void,const
- C语言学习笔记之void
- c语言学习笔记33之void
- C语言再学习 -- 关键字typedef
- C语言再学习 -- 存储类型关键字
- C语言再学习 -- 关键字const
- C语言再学习 -- 关键字volatile
- C语言学习之关键字
- 【学习】C语言中的关键字
- android studio从入门到提高到精通详解。。。
- springBoot项目代码加密总结
- Sign In and Sign Out
- CNN系列
- 干货分享!深度学习几何画板绘图技巧!
- C语言再学习 -- 关键字void
- 一句代码实现标题栏、导航栏滑动隐藏。ByeBurger库的使用和实现
- <%@ Page language="c#" Codebehind="Main.aspx.cs" AutoEventWireup="false" Inherits="Vod.WebForm1" %>
- Error:Xcode cannot launch 项目名 on 设备名 because the device is locked
- sass配置一条线
- Android 阅读 Office 文档,所有你能想到的解决方案都在这啦
- Ubuntu 16.04 64bit 安装teamviewer
- 【习题集四】无监督学习和强化学习
- Extjs Store 的用法详解