- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
c语言void与NULL完全解析
c语言void与NULL完全解析 作者:朱有鹏 1、void类型的本质 现在编程语言分2种:强类型语言和弱类型语言。强类型语言中所有的变量 都有自己固定的类型,这个类型有固定的内存占用,有固定的解析方法;弱类型 语言中没有类型的概念,所有变量全都是一个类型 (一般都是字符串的),程序 在用的时候再根据需要来处理变量。C语言就是典型的强类型语言,C语言中所 有的变量都有明确的类型。因为C语言中的一个变量都要对应内存中的一段内 存,编译器需要这个变量的类型来确定这个变量占用内存的字节数和这一段内存 的解析方法。 数据类型决定了变量占用的空间大小和内存的解析方法。所以C语言中变量 必须有确定的数据类型,如果一个变量没有确定的类型 (就是所谓的无类型)会 导致编译器无法给这个变量分配内存,也无法解析这个变量对应的内存。因此不 可能有没有类型的变量,但是C语言中可以有没有类型的内存。在内存还没有和 具体的变量相绑定之前,内存就可以没有类型。实际上纯粹的内存就是没有类型 的,内存只是因为和具体的变量相关联后才有了确定的类型(其实内存自己本身 是不知道的,而编译器知道,我们程序在使用这个内存时知道类型所以会按照类 型的含义去进行内存的读和写)。 void类型的字面上的含义是:不知道类型,不确定类型,或者说还没确定类 型,很多初学者把它理解成空的,这是不对的。我们以void a为例,void a定 义了一个void类型的变量,含义就是说a是一个变量,而且a肯定有确定的类 型,只是目前我还不知道a 的类型,所以标记为void类型。在C语言中如果我 们去定义一个void a; a 5;去执行它必然出错,因为a还没确定具体数据类 型,我们无法给它分配内存空间,故而出错。 那我们什么情况下需要void类型呢?其实就是在描述一段还没有具体使用 的内存时需要使用void类型。典型应用案例就是malloc的返回值。malloc() 函数的原型是void *malloc(size_t size);malloc函数向系统堆管理器申请一 段内存给当前程序使用,malloc返回的是一个指针,这个指针指向申请的那段 内存。malloc刚申请的这段内存尚未用来存储数据,malloc函数也无法预知这 段内存将来被存放什么类型的数据,所以malloc无法返回具体类型的指针,故 而返回一个void *类型,告诉外部我返回的是一段干净的内存空间,但尚未确 定类型。所以当我们在malloc之后可以给这段内存读写任意类型的数据。 void *类型的指针指向的内存是尚未确定类型的,因此我们后续可以使用强 制类型转换强行将其转为各种类型。这就是void类型的最终归宿-被强制类型转 换成一个具体类型。 现在我们来看程序8.3 #include stdio.h #includemalloc.h int main(void) { int *p (int *)malloc(sizeof(int));// 由void *强制转为 //int *,不会警告 (1) return 0; } 程序8.3 编译运行程序8.3,没有出错。但当我们把程序8.3中代码 (1)写成 int *p malloc(sizeof(int));,那么程序将无法通过编译报错,因为malloc无法返回 具体类型的指针。需要注意的是当使用void类型时一般都是用void *,而不仅 仅是使用void,这个是因为void *可以指向任何类型的数据。 2、 C语言中的NULL 2.1 NULL 的定义 NULL不是C语言关键字,本质上是一个宏定义,在C/C++中NULL 的标准定 义是这样的: #ifdef _cplusplus // 条件编译 #define NULL 0 #else #define NULL (void *)0 // 这里对应C语言 #endif 在C++的编译环境中,编译器预先定义了一个宏_cplusplus,程序中可以用 条件编译来判断当前的编译环境是C++的还是C的。在C语言中NULL的本质是0, 但是这个0不是当一个数字解析,而是当一个内存地址来解析的,这个0其实是 0代表内存的0地址。(v
文档评论(0)