一、指针
1. 定义:
int *a;
double *b;
int ival = 42;
int *p = &ival;
int *q = p; //指针类型必须相同
2. 指针的值:
指针的值必须属于下列四种状态之一:
a. 指向一个对象(object);
b. 指向对象所占空间的下一个位置(可能是逻辑地址也可能是物理地址);
【注】1.运行在Windows(Linux) Rang3的程序的指针指向逻辑地址,而且只能指向逻辑地址;
2.运行在Windows/Linux Rang0的程序的指针可以指向逻辑地址,也可以指向物理地址,由功能决定;
3.对于嵌入式系统,如果有MMU,而且启用了MMU,指针指向的是逻辑地址;
4.对于嵌入式系统,如果没有MMU,或者没有启用了MMU,指针指向的是物理地址。
c. 空指针;
int *p1 = 0;
int *p2 = nullptr;
int *p3 = NULL;
d. 无效指针;
3. void* 指针:
无法直接操作void*指针所指的对象。
二、引用
1. 概念:引用即变量的“别名”,且必须被初始化;
【注】无法令引用重新绑定另外一个对象。
2. 定义(允许一条语句定义多个引用):
int i = 1, j = 2;
int &m = i, &n = j;
三、指针和引用的异同
1. 相同之处:
a.指针和引用本质上都是地址的概念,引用在内部其实是用const指针来实现的;
b.给函数传递参数的时候,一级指针和引用作为函数参数的时候可以达到相同的效果;
例如:数组的引用和指向数组第0个元素的指针。
c.指针的大部分效果都可以通过引用来实现;
d.二级指针作为参数的时候就是希望在函数的内部修改指针的指向.这个时候利用指针的引用可以达到同样的效果;
2. 不同之处:
a. 指针本身即一个独立的对象,其可以反复修改指向的内容,允许赋值、拷贝等操作;
b. 指针并非一定要初始化,无需在定义时赋值;
c. 指针可以存在多级操作,即指向指针的指针,而引用不允许;
d. 引用可以引用指针,因为指针本身也是一个对象,但指针不可以指向引用;
e. 存在指针数组,不存在引用数组,但是存在对数组的引用。