《朱老师物联网大讲堂》学习笔记
学习地址:www.zhulaoshi.org
(1).
存储类,
变量存储在哪一种内存中,比如栈,堆,数据段,bss段,text段,
作用域,
变量起作用的范围,
代码块作用域,可以理解为{}之间的空间,
生命周期,
链接属性,
源代码编译成.o目标文件,里面有很多分段,数据段,代码段等...
变量名、函数名靠符号和对应内存链接在一起,
链接属性:外链接属性,内链接属性,无链接属性,
(2).
代码段,
对应程序中的代码,又叫.text,
只读数据段,
程序运行期间只能读不能写,
数据段,
显示初始化为非0的static局部变量,显示初始化为非0的全局变量,
bss段,
显示初始化为0或未显示初始化的全局变量,显示初始化为0或未初始化的static局部变量,
堆,使用取决于程序员,
文件映射区,
进程将文件从硬盘读取到文件映射区,以后在内存操作文件,
栈,局部变量呆的地方,
内核映射区,
操作系统的内核程序映射到这个区域,
(3).
auto修饰局部变量,auto的局部变量其实就是默认定义的普通的局部变量,
static,
修饰全局变量,形成静态全局变量,
修饰局部变量,形成静态局部变量,
1、静态局部变量在存储类方面和全局变量一样,
2、静态局部变量在生命周期方面和全局变量一样,
3、静态局部变量和全局变量的区别是:作用域、连接属性。静态局部变量作用域是代码块作用域(和普通局部变量是一样的)、链接属性是无连接;全局变量作用域是文件作用域(和函数是一样的)、链接属性方面是外连接,
register,
(4).
extern,
声明全局变量,在a.c中声明后才能使用b.c中的变量,
volatile,能否被编译器优化,
适合用在,isr中的变量,多线程中共用的变量,硬件会更改的变量,因为编译器无法预知这些变量的改变,
restrict,
用于修饰指针,强调该指针指向的变量,不能被除了该指针以外的指针修改,
(5).
作用域,
代码块作用域是{}括起来的部分,不仅仅是函数定义的那个{},if等也有{},
全局变量,函数作用域是所在文件范围,就是整个.c文件中,
同名变量的掩蔽规则,
(6).
生命周期,
栈,
堆,
全局变量的生命周期是永久的,与程序运行同在,
代码段的生命周期是永久的,
只读数据段,目前可以把它和代码段一样看待,
(7).
完整C程序包括多个c文件多个h文件,
程序编译后得到的是独立的.o文件,需要进行链接将独立的二进制函数组成一个整体的可执行程序,
不声明就无法单个文件进行编译,
函数和全局变量是外链接属性,
内链接,就是不能被外链接,不能被当前c文件外面的其它文件进行访问,
无链接,局部变量,静态局部变量都属于无链接,这些变量的符号本身不参与链接,
函数和全局变量的同名冲突,谁叫它们是外链接属性呢,那怎么办?
有些语言的解决方案是“命名空间namespace”,
c语言中的解决方法是,将明显不会在其它c文件中引用的全局变量和函数声明为static,这样它们的链接属性就变为内部链接了,
这种要么是,要么不是的方法,肯定有很大的局限性,对于大型的项目,除了可以确定为内链接的,还有很多外链接的,还是有重名问题,因为大型项目文件实在太多,
(8).
指针,全局变量,容易破坏全局性,java这种面向对象语言就不提供了,或者说是封装了,
那指针、全局变量与面向对象矛盾吗?
总结: