第九课
1,地址
内存单元的编号
注意://地址是不变的
//地址是唯一的
//地址是连续的
2,首地址
变量的第一个最大存储单元(地址其实就是一个整数)
3,指针
//指针:指针类型 大小始终为4个字节(在32位机器上)//大小始终为8个字节(在64位机器上)
//指针变量:是一个变量,用来保存地址
//例子:int a=3;int *p=&a;指针变量p保存了a的地址,也称指针p指向了a;
//指针指向的内存空间
比如:
整数:int
字符型:char
小数:float
地址:指针变量
4,指针定义
数据类型* 指针变量名
//定义指针类型的方法:写一个变量,再在变量名前面加*,表示这个变量是一个指针变量
//取地址:&变量名
//取值:*指针变量名
注意:指针的类型和所指向的类型,概念不同
//指针的类型,决定了取值时,以该类型的方式读取数据
//指针所指向的类型,与指针的类型无关
//指针:除了保存地址之外,还有额外的信息,如何取值
5,野指针
没有任何指向的指针,可能指向任何地方
6,空指针(NULL)
//指针指向了NULL ,NULL是0x00000000为系统保留地址,可用于初始化指针和条件判断
//空指针可以避免野指针产生,但也无法直接读取或输入
如:int* p=NULL;
7,void指针
//又叫万能指针,可以指向任意类型的变量
//使用时必须有确定的类型,可以通过强制类型转换来确定类型
//万能指针可以自动转换为任意类型的指针
例子:int a=0; void* p=&a;int* b=p;
8,二级指针
二级指针用来存储一级指针的地址
定义二级指针:数据类型** 指针变量名=&一级指针变量名
例子:
int a=0;
int* p=&a;
int**pp=&p;
//pp == &p
//*pp ==&a == p
//**pp == a ==*p
9,const与指针
//const在指针类型的前面,说明const修饰的指针所指向的内存空间不能通过指针去修改
例子1:【注意:const int* p 和 int const* p 两种写法效果相同】
int n=0;
int m=3;
const int* p=&n;
n=1;//true
*p=1;//error //不能通过指针改值
p=&m;//true//可以修改指针的指向
//const写在普通变量前面,写在指针类型后面,说明const修饰的是普通变量,可以通过指针修改值,但无法修改指针的指向
例子2:
int n=0;
int* const p=&n;
*p=666;//可以修改
int m=333;
p=&m;//error//不能修改p的指向