c语言:指针数组

下面我们再讨论一个特殊的数组,它的元素为指针。

我们先从普通的元素为 int 类型的数组开始。

int arr15 = {1, 2, 3, 4, 5};

int arr25 = {11, 22, 33, 44, 55};

int arr35 = {111, 222, 333, 444, 555};

arr1、arr2、arr3均为 int 5 类型的数组。

若数组名出现在表达式中,即会转换为指向首元素的指针,即 int * 类型。我们将这几个数组的首元素指针存储在另一个元素为 int * 的数组里。

int *pToArr3;

pToArr0 = arr1; //arr1转换为首元素指针,int5到int*

pToArr1 = arr2; //arr2转换为首元素指针,int5到int*

pToArr2 = arr3; //arr3转换为首元素指针,int5到int*

pToArr0的类型为 int* ,指向arr1的第1个元素。

pToArr1的类型为 int* ,指向arr2的第1个元素。

pToArr2的类型为 int* ,指向arr3的第1个元素。

pToArr的类型为 int *3 ,是一个数组。它有3个元素,每个元素的类型为 int * 。

由于元素类型为指针,所有它也被称为指针数组

定义和赋值完数组后,我们使用这个指针数组来访问所有元素。

for(int i = 0 ; i < 3; i ++)

{

int **p = pToArr + i; for(int j = 0; j < 5; j++)

{

printf("%d ", *(*p + j));

}

printf("\n");

}

看,这段程序遍历了3个数组的元素。

不过,这段程序的类型转换和运算稍微有点多,别着急,我们下面来详细分析它。

pToArr是一个 int *3 类型的数组,若出现在表达式 p = pToArr + i 中,即转换为指向首元素的指针,即 int *3 转为 int ** 。

p + 0 类型为 int** ,指向pToArr的第1个元素。

p + 1 类型为 int** ,指向pToArr的第2个元素。

p + 2 类型为 int** ,指向pToArr的第3个元素。

接着,我们分析表达式 *(*p + j) 。

|---|---------------------------------------------------------------------------------------------------|
| |
| | |

假设在 int **p = pToArr + i 中,i的值为0,那么p指向pToArr的第一个元素。

*p 表达式结果为pToArr0,指向arr1的第一个元素。

表达式 *p + j ,分别指向arr1中各个元素。

最后,表达式 *(*p + j) 取得arr1数组内各个元素的值。

我们再来顺一个整个流程。

p ,指向 pToArr 的第一个元素,类型为 int ** 。

*p ,指向 arr1 的第一个元素,类型为 int * 。

*p + j ,指向 arr1 中的第j个元素,类型为 int * 。

*(*p + j) ,为 arr1 中的第j个元素。

这样即可完成对 arr1 的访问,随着循环的继续,i会变为1,2。

p会指向pToArr中的第二、第三个元素,按照上面的处理,会继续访问arr2,arr3中元素的访问。

相关推荐
坚果派·白晓明6 分钟前
[鸿蒙PC三方库移植适配] 使用 AtomCode + Skills 自动完成Protobuf鸿蒙化适配
c语言·c++·华为·harmonyos
原来是猿20 分钟前
深入理解 C++ unordered_map 与 unordered_set
开发语言·c++
满天星830357721 分钟前
【Qt】信号和槽 (一)(概述和基本使用)
开发语言·c++·qt
l1t30 分钟前
DeepSeek总结的 waddler,一个 Go 语言编写的从 YAML 文件运行的 ETL 管道
开发语言·golang·etl
糖果店的幽灵1 小时前
Pandas DataFrame 数据结构详解
数据结构·pandas
FlyWIHTSKY1 小时前
React 19 + Next.js 16(App Router)项目中集成 MSW
开发语言·javascript·vue.js
Mr.Daozhi1 小时前
跨境电商选品完整流水线:Google Trends筛词+Meta广告分析,CLI工具设计实战
开发语言·爬虫·python·跨境电商·工具链·选品
多彩电脑1 小时前
Swift里字符串的索引
开发语言·swift
SoftLipaRZC1 小时前
C语言预处理详解:从宏定义到条件编译
c语言·开发语言
会周易的程序员1 小时前
C++ 对象池深度解析:架构设计与实现原理
开发语言·c++·物联网·iot·aiot