一.基础
1.指针和引用的不同
从汇编语言来看,一个指针和一个引用实现是相同的,他们都存放了一个地址。
但c++的高级语言特性赋予了引用和指针在使用上的差异
(1).引用必须初始化,必须依赖另一个对象才能存在,是另一个对象的别名
(2).引用初始化之后不能被改变;指针可以改变所指的对象
(3).“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
(4).指针常量本身(以p为例)允许寻址,即&p返回指针常量(常变量)本身的地址,被引用对象用*p表示;引用变量本身(以r为例)不允许寻址,&r返回的是被引用对象的地址,而不是变量r的地址(r的地址由编译器掌握,程序员无法直接对它进行存取),被引用对象直接用r表示。
2.指针与内存关系
指针变量存储的是一个内存中的地址,指针变量本身也有一个在内存中的地址
&p 指针自己的地址
p 指针存储的地址
3.程序编译过程
预处理:展开头文件/宏替换/去掉注释/条件编译
编译:要经历词法分析,语法分析,语义分析等等,将代码转换成汇编代码
汇编 : 汇编代码转换机器码
链接:合并相同段,并且重定位(分静态,动态,较复杂)
4.static、const、#define的用法和区别
static
(1).隐藏
所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问
如果加了static,就会对其它源文件隐藏
(2).static的第二个作用是保持变量内容的持久。(static变量中的记忆功能和全局生存期)
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。
(3).static的第三个作用是默认初始化为0(static变量)
const的作用
5.内存模型
从上到下
内核虚拟内存区
用户栈(向下生长)
|
共享库区域
|
堆 (向上生长)
读写数据段(.data,.bss)
只读代码段(.text,rodata)
6.栈和堆分配
栈是由系统自动分配的,堆由程序员申请
栈的大小一般是固定的,堆的大小是可变的
堆会产生碎片