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 既放在 * 前面,也放在 * 后面,则该指针既不能指向其他变量

也不能通过指针修改其指向变量的值

Logo

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

更多推荐