C语言基础(指针)
指针
指针基础
内存地址与基地址
内存地址
操作系统为每个字节分配一个唯一编号(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),表示返回值是指针类型。
输出型参数:实参将自己的内存地址传递给形参,形参借助实参的内存地址操作实参空间。
函数指针
函数指针本质是指针,一个指针变量,存储的是函数的入口地址(指向函数的指针)
回调函数:将一个函数作为参数传递给另一个函数。
策略模式:运行时动态选择要执行的函数
函数表:用数组统一管理多个函数
语法:
返回类型 (*指针变量名)(参数列表);
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)