详解C语言中的指针数组和数组指针

指针数组和数组指针是 C 语言中比较常见的两种类型。它们虽然名字很相似,但是含义、用法以及指向类型都不同,需要分开理解。

指针数组

指针数组是一个数组,其中每个元素都是一个指针。这些指针可以指向不同类型的数据,也可以指向相同类型的数据。例如,下面是一个包含 3 个指针的指针数组,其中每个指针指向一个整数:

复制代码
int a = 1, b = 2, c = 3;
int* ptr_array[3] = {&a, &b, &c};

上面这个指针数组 ptr_array 包含 3 个元素,每个元素都是一个指向整数的指针。这些指针分别指向变量 a、b 和 c 的地址。我们可以通过下标访问这些指针,进而访问到相应的整数:

复制代码
printf("%d %d %d\n", *(ptr_array[0]), *(ptr_array[1]), *(ptr_array[2]));

上面这行代码输出 1、2 和 3,分别对应变量 a、b 和 c 的值。

需要注意的是,指针数组中的每个元素都是一个指针,因此当我们想要使用指针数组的元素时,需要通过解引用运算符 * 来获取它所指向的值,例如上面的 *(ptr_array0)。

数组指针

数组指针是一个指针,它指向一个数组。它也可以指向不同类型的数组,例如整数数组、字符数组等。我们可以使用数组下标运算符 \[\] 来访问指针所指向的数组中的元素。例如,下面是一个指向 3 个整数的数组的指针:

复制代码
int array[3] = {1, 2, 3};
int (*ptr_array)[3] = &array;

上述代码中,ptr_array 是一个指向 3 个整数的数组的指针。我们可以通过下标访问数组中的元素:

复制代码
printf("%d %d %d\n", (*ptr_array)[0], (*ptr_array)[1], (*ptr_array)[2]);

上述代码会输出 1、2 和 3,分别对应数组中的元素。

需要注意的是,由于数组指针指向的是一个数组,因此当我们想要使用数组指针所指向的数组时,需要使用括号将指针和下标括起来,例如上面的 (*ptr_array)0。

下面是一个完整的示例代码,演示了指针数组和数组指针的使用:

复制代码
#include <stdio.h>

int main() {
    // 指针数组
    int a = 1, b = 2, c = 3;
    int* ptr_array[3] = {&a, &b, &c};
    printf("%d %d %d\n", *(ptr_array[0]), *(ptr_array[1]), *(ptr_array[2]));

    // 数组指针
    int array[3] = {1, 2, 3};
    int (*ptr_array2)[3] = &array;
    printf("%d %d %d\n", (*ptr_array2)[0], (*ptr_array2)[1], (*ptr_array2)[2]);

    return 0;
}
相关推荐
2301_322414280413 小时前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis
小郎君65813 小时前
MPTT树复选框的半选状态:一棵百万节点树从递归到计数器,再到区间覆盖
算法
酌沧13 小时前
MemT让记忆成为模型内生能力
jvm·人工智能·算法
水饺编程13 小时前
第2章:Linux 基础,切换用户
linux·c语言·汇编
考虑考虑14 小时前
JDK26的JEP 500属性
java·后端·java ee
LMT流氓兔14 小时前
第五单元——第十二课:把脚本整理成项目
java·数据库·python·langchain·1024程序员节
yuniko-n14 小时前
【JUC】四种内存屏障示例
java·1024程序员节
Shimeri14 小时前
越卷越像:我用遗传算法做了个"内卷"实验
算法·three.js·数据可视化·遗传算法·进化算法
Evand J14 小时前
【PMSM例程1】永磁同步电机(PMSM)转速与转子电角度观测算法|基于扩展卡尔曼滤波(EKF)的传感器状态估计与误差。附下载链接
算法·电机·1024程序员节·卡尔曼滤波
guo_wen_qiang14 小时前
二叉树的层序遍历-使用双端队列Deque
算法·leetcode·1024程序员节