什么是指针

1.C语言中指针是一种数据类型,指针是存放数据的内存单元地址。
2.计算机系统的内存拥有大量的存储单元,每个存储单元的大小为1字节,为了便于管理,必须为每个存储单元编号,该编号就是存储单元的“地址”,每个存储单元拥有一个唯一的地址!
3.为了方便对于这些地址进行管理, C推出了专门对于地址的管理体系, 就是所谓的指针,这里一个指针代表的是一个地址, 同时当前地址可以被进行操作

指针、地址、内存

指针变量

1.格式: 数据类型符 *指针变量名[=初始地址值]。

2.功能及目的:用来承接地址且提供运算依据

变量指针

指的是一个变量的地址

取地址符号 &

取地址运算符“&”的功能是取变量的地址,它是单目运算符。取地址运算符的运算对象必须是已经定义的变量或数组元素,但不能是数组名。运算结果是运算对象的地址

指针运算符 *

指针运算符“*”的功能是取指针变量所指向地址中的内容,与取地址运算符“&”的运算是互逆的,它是单目运算符。指针运算符的运算对象必须是地址,可以是已赋值的指针变量,也可以是变量或数组元素的地址,但不能是整数,也不能是非地址型的变量。运算结果就是地址对应的变量。

运算符的支撑

指针变量 ± 整数;

指针变量++ 与 ++指针变量;

指针变量– 与 –指针变量;

指针变量1- 指针变量2;

案例

指针比较

<, <=, ==, >, >=, !=都可以对指针做比较

比较它们在内存中的地址,数组中的单元的地址肯定是线性递增的

0地址

当然你的内存中有0地址,但是0地址通常是个不能随便碰的地址

因此可以用0地址来表示特殊的事情:
返回的指针是无效的
指针没有被真正初始化(先初始化为0)

NULL是一个预定义的符号,表示0地址

异常指针

空悬指针:
指针正常初始化,曾指向过一个正常的对象,但是对象销毁了,该指针未置空,就成了悬空指针

野指针:
未初始化的指针,其指针内容为一个垃圾数。 (一般我们定义一个指针时会初始化为NULL或者直接指向所要指向的变量地址,但是如果我们没有指向NULL或者变量地址就对指针进行使用,则指针指向的内存地址是随机的)。存在野指针是一个严重的错误

NULL指针分配的分区:其范围是从 0x00000000到0x0000FFFF。这段空间是空闲的,对于空闲的空间而言,没有相应的物理存储器与之相对应,所以对这段空间来说,任何读写操作都是会引起异常的。空指针是程序无论在何时都没有物理存储器与之对应的地址。为了保障“无论何时”这个条件,需要人为划分一个空指针的区域,固有上面NULL指针分区。

堆空间内存分配问题

目的:在程序运行过程中按需要自由分配所需空间;

malloc:在内存的动态存储器(堆区)中分配一块长度为size字节的连续内存空间,用来存放类型说明符指定的数据类型

free:free函数释放ptr指向的内存

本文地址: http://www.yppcat.top/2023/02/19/指针详解/