1.指针的定义:
指针就是专门用来存放另一变量在内存中数据的地址
假如定义了指针p是一个变量a的地址,那么p就是a在计算机内存里面存放的地址
通过地址能找到所需的变量单元,可以说, 地址指向该变量单元,将 地址形象化地称为 ”指针“ 。
- 变量:命名的内存空间,用于存放各种类型的数据
- 变量名:变量名是给内存空间取一个容易记忆的名字。
- 变量值:在变量单元中的存放的数据值
- 变量的地址: 变量所使用的内存空间的地址,即指针。
1.1.指针和指针变量
- 指针(Pointer)是一种特殊的变量类型,它用于存储内存地址。
- 指针的实质就是内存“地址”
- 指针变量就是存储这个地址的变量。
指针变量 :一个变量专门用来存放另一变量在内存中数据的地址(即指针),则它称为”指针变量“ 。我们可以通过访问指针变量达到访问内存中另一个变量数据的目的。(有时为了阐述方便 ,将指针变量 直接说成指针 )
1.2、指针变量的定义
- 指针也是一种数据类型,其 类型 是 指针 指向的 内存空间 的 数据类型,指针变量也是一种变量,用来存储地址的变量
- 指针变量指向谁,就把谁的地址赋值给指针变量
语法格式:数据类型 * 指针变量名[=初始地址值 ]
- 数据类型 是指变量所指向变量数据类型。可以是int 、char 、float等基本类型,也可以是数组等构造类型。 (变量)
- 字符 * 用于告知系统这里定义的是一个指针变量,通常跟在类型关键字的后面。 (指针变量)
2、指针的运算
指针作为一种特殊的类型可以参与运算,但与其他数据类型不同的是,指针的运算都是针对内存中的地址来实现的。
普通变量定义:类型 变量;
指定变量定义:类型 *指针变量=&变量
- & 叫取地址,返回操作数的内存地址
- * 叫解引用,指 操作指针所指向的变量的值
- 在定义变量时,* 号表示所声明的变量为指针类型
- 指针变量要保存某个变量的地址,指针变量的类型比这个变量的类型多一个 *
- 在指针使用时,* 号表示操作指针所指向的内存空间
指针变量赋值
1.指针变量中只能存放地址 (指针),不要将一个整数(或任何其它非地址类型的数据)赋值给一个指针变量
2.C语言中的地址包括位置信息(内存编号,或称纯地址)和它所指向的数据的类型信息,即它是 ”带类型的地址“。
所以,一个指针变量只能指向同一个类型的变量,不能抛开类型随意赋值。如: char *类型的指针是为了存放char类型变量的地址
3.在没有对指针变量赋值时,指针变量的值是不确定的,可以系统会分配一个未知的地址,此时使用此指针变量可能会导致 不可预料的后果甚至是系统崩溃。为了避免这个问题,通常给指针变量赋初值为0(或NULL),并把值为0的指针变量称为 空指针变量。
- 指针变量指向谁,就把谁的地址赋值给指针变量
- 通过 *指针变量 间接修改变量的值
2.1指针的步长
指针步长指的是通过指针进行递增或递减操作时,指针所指向的内存地址相对于当前地址的偏移量。
●指针的步长取决于所指向的数据类型。
○指针加n等于指针地址加上 n 个 sizeof(type) 的长度
○指针减n等于指针地址减去 n 个 sizeof(type) 的长度
3.野指针
1、指针未初始化
- 指针变量在定义时不会自动初始化,如果未初始化,而是随机的一个值。此时操作指作 指针就是去访问一个不确定的地址,所以结果是不可知的。此时该指针成为野指针。
- 解决方案:在定义指针时,要么将其初始化为一个合理的地址,要么初始化为NULL
2.指针越界访问
3、指针指向空间的释放后未置为NULL
- 在使用free或delete释放内存后,指针指向的内容被销毁,空间被释放,但指针的值并未改变,仍然指向这块内存。
- 解决方案:在调用free或delete之后,应立即将该指针置为NULL,以避免成为野指针。
2.1 避免野指针的方法:
1. 指针初始化 int *p=NULL;
赋值为NULL值的指针称为 空指针,NULL指针是一个定义在标准库中的值为零常量
# defined NULL 0
2. 小心指针越界
3. 指针指向空间释放及时置NULL
4. 避免返回局部变量的地址
5. 指针使用之前检查有效性
4.二级指针(多级指针)
- 语言允许有多级指针存在,在实际的程序中一级指针最常用,其次是二级指针。
- 二级指针就是指向一个一级指针变量地址的指针。
- 多级指针,通俗的讲就是指针的指针
格式 : 数据类型 **指针变量
如下面举例说明:
int a=10;
int *pa = &a;// pa是一级指针
int **ppa = &pa; // ppa是二级指针 ,类型为 int **
---int * 表明 ppa指向的元素类型 第二个 * 等于是告诉编译器 ppa是一个指针变量
int ***pppa = &ppa; //p 这种情况一般不会遇到的
上面这段代码, pa 就叫一级指针,也就是平时常说的指针,
ppa 就是二级指针。
- 指针本身也是一个变量,需要内存去存储,指针也有自己的地址
- 指针内存存储的是它所指向变量的地址