指针:本质就是地址
地址是什么?
数据和指令最终都要存放在内存,cpu按照我们写的程序去访问内存,内存本质就是一个一个字节组成的,也就是说我们写的程序要去访问内存的一个个字节进而访问指令或者数据,那要实现这个目的,每个字节都长的一样,如何区分?
给每个字节编号来区分
地址:内存的基本单元是字节,每一个字节都有自己的唯一的编号,通过这个编号就可以找到这个字节进而访问这个字节,这个编号就是这个字节的地址
Char 一个字节
Int 四个字节
Int arr[5] 20字节
不管是多少个字节,每一个字节都有编号,那最终访问到这么多字节,你必须知道从那个编号开始的(首地址)以及你能访问的字节的个数,你就可以访问到这些字节
指针:地址就是指针
指针常量:内存的编号就是指针常量,因为不会发生改变
指针变量:用来存放内存编号的一个变量,可以被修改
我们平时说的指针默认指的是指针变量,也就是说直接说指针,而不说指针变量
指针就是地址,地址是组成内存的每一个字节的编号。
(一)指针的定义
&a是一个常量,p是一个变量,&a不能被改变,但是可以改变p的指向
(二)指针的定义方式
数据类型 * 指针变量名 = 地址常量;
(三)指针的指向类型和数据类型
Int a = 10;
Int *p = &a;
指针的数据类型:去掉变量名 int *
指针的指向类型:去掉变量名和一个* int
(四)指针的数据类型大小
指针的数据类型大小永远是固定的,64OS 是8个字节,在32OS 里面是4个字节,不会因为指向的数据类型改变,而改变自身的数据类型大小。
(五)*p和p
在指针里面 *的作用
- int *p;*的作用是标识符
- *p = a;*的作用是取值运算符,取了a空间里面的内容
- 分辨*的用法:标识符一般出现在定义的时候,会出现数据类型,取值运算符一般用在运算的时候,这时候不会出现数据类型。
(六)Const修饰指针
Int const *p:const 修饰的是*p,*p不能被改变,p的指向可以被改变
Int * const p:修饰的是p,p的指向不能被改变,改变的是*p的值
Int * const p int const *p
*在const的左边还是右边
*在左边不能去修改p的指向,*在const的右边不能去修改值
左指,右数
(七)空指针和野指针
野指针:没有明确的指向的指针
怎样避免野指针?
让野指针先指向零号地址,变成空指针(指向零号地址),零号地址不能被操作