一.

1.引用是别名,当建立引用是,是用具体的实体(对象或变量)对别名初始化。
2.&表示引用时是定义引用型变量时,在等式的左边,其他情况表示取地址。

//定义形式
int m;
int &j=m;

3.引用型变量不分配内存单元,指针分配内存单元。

引用与指针

(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL);
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
//函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。

void Fun1(int x){
    x=x+10;
}
void Fun2(int *x){
    (*x)=(*x)+10;
}
void Fun3(int &x){
    x=x+10;
}
//“引用”可以做的任何事情,“指针”也都能够做。

内存分配

1.内存分配方式有三种:
(1)从静态存储区域分配。内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
(2)在栈上创建在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存,动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
注意不要返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁。
用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。

指针参数是如何传递内存的

1.如果函数的参数是一个指针,不要指望用该指针取申请动态内存。
2.如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”
由于二级指针不容易理解,我们可以用函数返回值来传递动态内存。
3.强调不要用return语句返回指向“栈内存”的指针,因为该内存在函数结束时自动消亡。
4.指针p被free或者delete之后,没有置为NULL,产生野指针。