C语言高级-操作系统、main()、NULL

第一点

操作系统如何工作

像人类社会一样的计算机软件系统(有些人只埋头干活,有些人只做管理)
(1)人类社会最开始时人人都干活,这时候没有专业分工,所有人都直接做产生价值的工作。当时是合适的,因为当时生产力低下,人口稀少。这就像裸机程序一样(裸机程序的特点是:代码量小,功能简单、所有代码都和直接目的有关,没有服务性代码)。
(2)后来人口增加生产力提高,有一部分人脱离了直接产生价值的体力劳动专职指挥(诞生了阶级)。本质上来说是合理的,因为资源得到了更大限度的使用,优化了配置,提升了整体效率。程序也是一样,当计算机技术发展,计算机性能和资源大量增加,这时候写代码也要产生阶级也要进行分工,不然如果所有代码都去参加直接性的工作,则整体系统效率不高。(因为代码很难进行资源的优化配置)。
(3)解决方案就是操作系统。操作系统就是分出来的管理阶级,操作系统的代码本身并不直接产生价值,它的主要任务是管理所有资源,它主要为直接产生价值、直接劳动的那些程序(各种应用程序)提供服务。所以操作系统既是管理者也是服务者。

操作系统的调用通道

操作系统负责管理和资源调配,应用程序负责具体的直接劳动,他们之间的接口就是API函数。当应用程序需要使用系统资源(譬如内存、譬如CPU、譬如硬件操作)时就通过API向操作系统发出申请,然后操作系统响应申请帮助应用程序执行功能。

C库函数和API的关系

单纯的API只是提供了极简单没有任何封装的服务函数,这些函数应用程序是可用的,但是不太好用。应用程序为了好用,就对这个API进行了二次封装,把它变得好用一些,于是就成了C库函数。有时完成一个功能,有相应的库函数可以完成,也有API可以完成,用哪个都行。譬如读写文件,API的接口是open write read close;库函数的接口是fopen fwrite fread fclose。fopen本质上是使用open实现的,只是进行了封装。封装肯定有目的(添加缓冲机制)。

第二点

main函数的返回值给了谁

谁执行了main函数,main函数的返回值就给了谁,也就是谁main函数返回给了他的父进程!

linux shell中用$?这个符号来存储和表示上一个程序执行结果。

给main函数传参(argc argv)

argc是int类型,表示程序运行的时候给main函数传递了几个参数;argv是一个字符串数组,这个数组用来处处多个字符串,每个字符串就是我们给main函数传的一个参数。argv[0]就是我们给main函数的第一个传参,argv[1]就是传给main的第二个参数,以此类推。。。。。。

第三点

C语言中的NULL

NULL是什么

标题

NULL的本质是0,但是这个0不是当一个数字解析,而是当一个内存地址来解析的,这个0其实是0x00000000,代表内存的0地址。(void *)0这个整体表达式表示一个指针,这个指针变量本身占4字节,地址在哪里取决于指针变量本身,但是这个指针变量的值是0,也就是说这个指针变量指向0地址(实际是0地址开始的一段内存)。

从指针角度解析NULL

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

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

在绝大部分CPU中,0地址是不能随便访问的,但是我们用NULL的原因就是为了让指针指向0地址处,这样就可以解决野指针误伤的问题。【就像我们为了防止孩子忘记回家的路走丢,那我们和孩子规定一个下次迷路就去的地方,以后每次我们发现孩子不见了,就去这个地方找

'\0' 和 '0' 和 0  和 NULL

这个问题我们在上一篇文章中有过介绍,我们在这再提一下;

‘\0’是是一个转义字符,他对应的ASCII编码值是0,本质就是0,\0'用法是C语言字符串的结尾标志;

‘0’是一个ASCLL值,代表值为48

0就是现实中的数字0

NULL是一个表达式,是强制类型转换为void *类型的0,本质是0.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值