嵌入式 C 语言:指针(二)
字符指针,指针数组,多级指针,void 指针
3.字符指针
3.1 指针概述
C 语言中,通常使用字符数组处理字符串;
关于字符串,谨记:
如 char ch[10] = " hello ",长度为 5 ,但 “ \0 ” 省略,在内存中占据 6 个字节 ;
char 类型的指针变量称之为 字符指针变量,也会被用来处理字符串;
<以下代码是指针变量的简单运用:输出字符;

<以下代码是指针变量的简单运用:输出字符串
注意,打印字符串时只需输入首地址;

<以下代码是指针变量的简单运用:让笔者困惑的是为何只修改了字符串的首个字符

3.2 易错点
① 字符串地址赋给指针,通过指针间接控制字符串;
将字符串的首地址赋给指针,可以通过该指针修改字符串内容,这是可变的;
即将首地址赋给字符指针;

② 字符串常量直接赋给指针;
将字符指针指向一个字符串常量,不能修改指针指向的对象的值;
即将字符串直接赋给字符指针;

<如下代码非常重要:
从内存管理的角度看
全局变量,字符常量,静态变量(static 修饰的变量)
存储在静态区中,程序运行结束时才释放内存
因此字符常量不可以被修改
<比如,以下代码中复制也不能修改字符常量

局部变量(如 main 函数中声明的变量)存储在栈中

内存管理如下图所示:

3.3 字符串连接
不使用字符串相关函数,对其进行连接操作;
<如下代码所示:
循环 1: 找到字符串数组 ch 中 ‘\0’ 的位置
循环 2 :通过字符指针将字符串赋给 字符串数组 ch,不可颠倒赋值顺序,毕竟字符串常量不可修改

内存原理图:

关于 11 行,这里输出 *p++ 观察其结果;

4. 指针数组
4.1 概述
指针数组是一种数组,其中每个元素都是指针变量
指针数组的一般说明形式:
<数据类型> * <指针数组名> [ ],如 int * p [ 3 ](一般将“ <数据类型> * ”看作一个整体)
指针数组名表示该指针数组的起始地址
<如下,表示指针数组的简单实用:声明一个指针数组,给其赋值并打印结果:

4.2 运用
4.2.1 优点
创建指针数组,使用多个指针似乎没有必要
况且,由上述可知,指针数组似乎使整个程序变得麻烦、复杂了
其诞生似乎没有必要;
优点一:高效内存管理
如使用二维数组存储字符串:char a[ 3 ][ 3 ] = { “ as ” , " a " , " b " } 会浪费 2 个字节
直接使用指针数组存储:char* p[ 3 ][ 3 ] = { " as " , " a " , " b " }
通过指针直接访问字符串首地址
系统不会为字符串分配固定长度,减少了空间浪费
优点二:便于管理内存
指针数组将分散数据的首地址集中存储,提供统一访问入口(通过数组索引)
简化了对分散数据的批量操作(如遍历、修改指向)
优点三:灵活性高(这也是指针的优点)
指针数组中的指针可随时修改指向,无需移动数据,灵活适配数据的动态变化
4.2.2 运用一
指针数组经常与二维数组联合使用:
<下面是二维数组与指针数组的使用:通过指针数组表示二维数组某些元素

此外,还可以对指针数组赋值;
<如下,指针数组中赋值行地址;

内存管理如图所示:

<如下,将二维数组看作多个一维数组;

内存管理如图所示:

4.2.3 运用二
通过指针数组求得二维数组所有元素的和
<如下代码所示:

4.3 注意
①:指针数组占用的内存空间
前面说过,64 位系统中指针变量占 8 个字节,无论其是什么数据类型;
故指针数组占用的内存空间 = 8 * 数组元素个数;
②:指针数组名相当于什么样的指针?
<以上问题如下所示:

5. 多级指针
5.1 概述
多级指针:指向 指针变量 的 指针变量 称之为多级指针变量
一级指针变量:前面用到的所有指针几乎为一级指针,即指向数据地址的指针变量;
二级指针变量:指向一级指针变量的指针变量
< 如下代码演示二级指针的简单使用:

下图是内存存储情况:

5.2 多级指针与指针数组
先来看一个简单的例子:
<如下演示指针数组与多级指针的简单使用:

<打印字符串:打印时注意只需要打印地址即可;

6. void 指针
void 指针是一种不确定数据类型的的指针变量
可以通过强制转换使该变量指向任何数据类型的变量
void 指针一般使用时不做转换,打印输出时必须强制转换
< 以下是void指针的简单使用

void 指针未强制转换之前不能进行算术运算:
7. const
const 修饰谁,谁就不能改;

const 放在 * 前面:限制通过指针修改指针所指向变量的值,即不能通过指针修改目标
但指针变量存储的地址可以更改,即可以只想其他数据;
<如下代码是演示:

const 放在 * 后面:存储的地址的值不能修改,即不能指向其他数据
但可以通过指针变量修改其指向的数据的指
<如下代码是演示:

const 既放在 * 前面,也放在 * 后面,则该指针既不能指向其他变量
也不能通过指针修改其指向变量的值

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐

所有评论(0)