指针

指针基础

内存地址与基地址

内存地址

操作系统为每个字节分配一个唯一编号(12位16进制数表示),用于定位内存位置。

基地址(首地址)

单字节数据:如char,地址就是该字节的编号。

多字节数据:如int占4个字节、double占8个字节:地址是所有字节编号中最小的那个,称为基地址或首地址。

指针的本质

指针的本质是内存地址,目的是通过地址找到对应的内存空间。

变量指针:变量的基地址(如&a是变量a的指针)

指针变量:存储地址的变量(如int *p

变量指针是地址(变量的首地址)

指针变量是变量(值为指针的变量,指针变量只能存储内存地址,变量空间的大小实际上就是long的大小)

取地址符(&)

用于获取变量的基地址。

地址的输出格式%p(按照16进制输出地址)

关键结论:

无论变量类型(char/int/double),变量的地址存储大小固定

支持函数修改实参

支持动态内存管理

支持动态数据结构

提供内存的间接访问,提升代码灵活性

变量指针与指针变量

对比维度 变量指针 指针变量
本质 内存地址 存储地址的变量
操作符 &:取地址运算符 *:指针声明符/指针解引用符
可修改性 不可修改(地址由系统分配) 可修改(如p = &b,指向新地址)
实例 &a(获取a的地址) int *p = &a (p存储a的地址)

补充说明:

Linux 64位系统仅使用48位寻址(12位16进制),Windows64位系统使用64位寻址(16位16进制)。

内存数据的存取方式

直接访问和间接访问(指针)

1.直接访问

通过变量名/数组下标直接访问内存。

2.间接访问

通过指针变量存储的地址,间接访问目标内存(*位解引用符)

指针变量的使用

1.赋值:给指针变量赋目标变量的地址

2.解引用:通过*指针变量访问/修改目标变量的值

3.取地址:通过&指针变量获取指针变量自身的地址

注意事项

1.指针变量必须指向同类型变量

2.指针变量的解引用操作,一次访问的内存大小等于指针指向的变量类型的大小

3.未初始化的指针不能解引用

指针与数组

指针变量指向数组元素

数组元素的指针

数组的指针:数组首个元素的内存首地址(数组名默认代表该地址,是不可修改的指针常量)

数组元素的指针:单个数组元素的内存地址,可通过指针变量指向数组元素或数组首地址

核心结论:C语言中数组名是一个"指针常量"(值为数组首地址,不可被赋值修改),访问数组名等价于访问数组首地址。

指针的运算

定义:

指针运算仅适用于同一数组元素的指针(仅支持数组内元素的地址偏移)。

核心逻辑:

指针的偏移量 = 运算数 * 指针指向类型的字节数

注意事项:

1.sizeof是编译期运算符,不执行表达式运算符(如sizeof(++a)++a未执行)

2.指针运算的核心是按类型偏移,而非简单的地址加减(如int指针+1偏移4字节)

指针法遍历数组

1.下标法遍历数组

2.指针法遍历数组(3种)

数组名作函数参数

数组名作为函数参数时,会自动退化为指针。

数组指针

指针和数组中符号优先级

() > [] > *

数组指针

定义:

数组指针时指向整个数组的指针变量(本质是指针),区别于指向数组元素的指针。

核心区别:

指向数组元素的指针:int *p = arr == &arr[0]

指向整个数组的指针int (*p)[len] = &arr

一维数组指针

定义:就是指向一维数组的指针变量。

语法:

数据类型 (*指针变量名)[数组容量];

一维数组指针必须依赖于一维数组

二维数组指针

二维数组可视为数组的数组(每行是一个一维数组),因此二维数组指针有两种写法。

写法一:二维数组指针

语法:

数据类型(*指针变量名)[行容量][列容量];

写法二:一维数组指针指向二维数组

写法:

数据类型 (*指针变量名)[列容量] = 二维数组名;

通过指针引用二维数组

表现形式(int) 说明
arr 二维数组名,指向第0行,存储的是0行首地址
arr[0],*(arr+0), *arr 0行0列元素地址,,数组退化为指针
arr+1,&arr[1] 1行首地址
*(arr+1), arr[1] 1行0列元素的地址
arr[1]+2,*(arr+1)+2, &arr[1][2] 1行2列元素的地址
*(arr[1]+2), *( *(arr+1)+2) 1行2列元素的值

指针数组

定义:

指针数组是一个数组,数组中每一个元素都是一个指针变量

核心特性:

本质是数组,数组元素的类型是指针

先有指针类型,后定义数组(数组的元素类型为指针)

语法:

数据类型 *指针变量名[数组容量];

字符指针与字符串

字符串的两种实现方式:

数组形式:字符数组存储字符串(可修改内容)

指针形式:字符指针指向字符串常量(不可修改内容)

指针函数与函数指针

指针函数

指针函数本质是函数,一个函数的返回值类型是指针。

语法:

返回类型 *函数名(参数列表);

关键:*与函数名结合(*fun),表示返回值是指针类型。

输出型参数:实参将自己的内存地址传递给形参,形参借助实参的内存地址操作实参空间。

函数指针

函数指针本质是指针,一个指针变量,存储的是函数的入口地址(指向函数的指针)

回调函数:将一个函数作为参数传递给另一个函数。

策略模式:运行时动态选择要执行的函数

函数表:用数组统一管理多个函数

语法:

返回类型 (*指针变量名)(参数列表);
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐