c语言:指针数组

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

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

int arr1[5] = { 1, 2, 3, 4, 5};

int arr2[5] = { 11, 22, 33, 44, 55};

int arr3[5] = { 111, 222, 333, 444, 555};

arr1arr2arr3均为 int [5] 类型的数组。

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

int *pToArr[3];

pToArr[0] = arr1; //arr1转换为首元素指针,int[5]int*

pToArr[1] = arr2; //arr2转换为首元素指针,int[5]int*

pToArr[2] = arr3;  //arr3转换为首元素指针,int[5]int*

pToArr[0]的类型为 int* ,指向arr1的第1个元素。

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

pToArr[2]的类型为 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 表达式结果为pToArr[0],指向arr1的第一个元素。

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

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

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

 

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

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

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

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

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

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

相关推荐

  1. C语言 数组指针

    2023-12-23 22:36:03       41 阅读
  2. C语言指针数组

    2023-12-23 22:36:03       16 阅读
  3. C语言指针数组 指针的运算

    2023-12-23 22:36:03       54 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-23 22:36:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-23 22:36:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-23 22:36:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-23 22:36:03       20 阅读

热门阅读

  1. <ctype.h> 头文件:C 语言字符处理函数详解

    2023-12-23 22:36:03       36 阅读
  2. js-cookie的使用以及存储token安全的注意要点

    2023-12-23 22:36:03       36 阅读
  3. QT-quick 学习整理

    2023-12-23 22:36:03       39 阅读
  4. Redis延迟队列原理及实例

    2023-12-23 22:36:03       30 阅读
  5. SpringBoot中常见配置配置,MySQL、Redis、MinIO等

    2023-12-23 22:36:03       31 阅读
  6. 姓名,名字

    2023-12-23 22:36:03       37 阅读
  7. k8s-node一键脚本扩容

    2023-12-23 22:36:03       36 阅读
  8. K8s 教程

    2023-12-23 22:36:03       48 阅读
  9. 通信小白必读:EVM是啥?为啥这么重要?

    2023-12-23 22:36:03       33 阅读
  10. A REFINED ENGLISH LEARNING PLAN

    2023-12-23 22:36:03       38 阅读