C语言之——void和NULL

一、void

(1)void用于函数声明

没有返回值的函数,其类型为 void

void perror( const char * );

参数列表中的关键字 void 表示该函数没有参数

FILE *tmpfile( void );

(2)指向void的指针

void类型的正确的含义是:不知道类型,不确定类型,还没确定类型。

一个 void* 类型的指针代表了对象的地址,但没有该对象的类型信息。例如,标准内存管理函数malloc刚申请的这段内存尚未用来存储数据,malloc函数也无法预知这段内存将来被存放什么类型的数据,所以malloc无法返回具体类型的指针,解决方法就是返回一个void *类型,告诉外部我返回的是一段干净的内存空间,尚未确定类型,后续可以使用强制类型转换强行将其转为各种类型。

二、NULL

NULL不是C语言关键字,本质上是一个宏定义。

#ifdef _cplusplus			// 条件编译
#define NULL 0
#else
#define NULL (void *)0		// 这里对应C语言的情况
#endif

NULL的本质是0,但是这个0不是当一个数字解析,而是当一个内存地址来解析的,这个0其实是0x00000000,代表内存的0地址。

从指针角度理解NULL的本质

(1)int *p; // p是一个函数内的局部变量,则p的值是随机的,也就是说p是一个野指针。

(2)int *p = NULL; // p是一个局部变量,分配在栈上的地址是由编译器决定的,我们不必关心,但是p的值是(void *)0,实际就是0,意思是指针p指向内存的0地址处。这时候p就不是野指针了。

(3)为什么要让一个野指针指向内存地址0处?主要是因为在大部分的CPU中,内存的0地址处都不是可以随便访问的(一般都是操作系统严密管控区域,所以应用程序不能随便访问)。所以野指针指向了这个区域可以保证野指针不会造成误伤。如果程序无意识的解引用指向0地址处的野指针则会触发段错误。这样就可以提示你帮助你找到程序中的错误。

区分'\0' 和 '0' 和 0  和 NULL:

  • '\0'是一个转义字符,他对应的ASCII编码值是0,本质就是0
  • '0'是一个字符,他对应的ASCII编码值是48,本质是48
  • 0是一个数字,他就是0,本质就是0
  • NULL是一个表达式,是强制类型转换为void *类型的0,本质是0.

 

REF:

http://c.biancheng.net/view/179.html

朱有鹏物联网大讲堂课堂笔记

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值