news 2026/4/24 12:18:14

从“看不懂”到“能用”:一次搞清 C 语言指针数组

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从“看不懂”到“能用”:一次搞清 C 语言指针数组

摘要

在学习 C 语言指针时,很多同学会卡在“指针数组”“二级指针”这些概念上,感觉代码能跑,但就是不知道有什么用。
本文通过一个学生成绩管理的小功能,把“指针数组”“指向指针的指针”真正用起来,结合完整代码,逐行解释指针的变化过程,让你明白:

  • 指针数组到底解决了什么问题
  • 为什么要用“指向指针的指针”
  • 这种写法在真实程序中能做什么

如果你已经学过数组和一级指针,这篇文章可以帮你把知识真正串起来。

描述(实际使用场景)

假设我们在做一个学生成绩管理程序

  • 学校里有多个学生
  • 每个学生的成绩单独存放
  • 程序需要统一管理这些成绩数据,并依次输出

如果我们直接用二维数组,当然也能做,但灵活性不够。
真实项目里,不同学生的数据往往来自不同位置,这时候就非常适合用指针数组来管理。

于是我们可以这样设计:

  • 用一个整型数组a保存某个学生的成绩
  • 用一个指针数组num,每个元素都指向a中的某一个成绩
  • 再用一个指向指针的指针p,统一遍历这些指针

这和你给出的教材示例在逻辑上是完全一致的,只是换成了一个“能说清用途”的场景。

题解答案(思路说明)

实现思路可以分成四步:

  1. 定义一个整型数组a,保存学生的成绩
  2. 定义一个指针数组num,让它指向a中的每个元素
  3. 定义一个指向指针的指针p,指向num的首元素
  4. 通过移动p,间接访问并输出每一个成绩

这个过程看起来绕,但本质是:

用指针数组统一管理数据地址,再用二级指针进行遍历。

题解代码分析

完整代码

#include<stdio.h>intmain(){// 学生成绩数组inta[5]={1,3,5,7,9};// 指针数组,每个元素指向成绩数组中的一个元素int*num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};// 指向指针的指针int**p;inti;// 让 p 指向指针数组 num 的首元素p=num;// 遍历并输出成绩for(i=0;i<5;i++){printf("%d ",**p);p++;}printf("\n");return0;}

关键代码逐行讲解

成绩数组
inta[5]={1,3,5,7,9};

这一步很简单,相当于存了 5 个学生成绩。

指针数组的作用
int*num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};

这里是重点

  • num是一个数组
  • 数组里的每个元素都是int *
  • 每个指针都指向成绩数组a的一个元素

你可以把它理解成:

num 不是存成绩,而是存“成绩的地址”。

指向指针的指针
int**p;

这表示:

  • p指向的是一个int *
  • 也就是说,p指向的是num里的某一个元素
p 的初始化
p=num;

这一步非常关键:

  • num代表指针数组首元素的地址

  • p开始指向num[0]

  • 此时:

    • *p等价于num[0]
    • **p等价于a[0]
输出逻辑
printf("%d ",**p);

这是整个程序最容易让人迷糊的地方:

  • p指向num[i]
  • *p得到&a[i]
  • **p得到a[i]的值
指针移动
p++;

每次p++

  • 指向下一个num元素
  • 间接访问下一个成绩

示例测试及结果

程序运行输出

1 3 5 7 9

对应关系说明

p 指向*p 的值**p 的值
num[0]&a[0]1
num[1]&a[1]3
num[2]&a[2]5
num[3]&a[3]7
num[4]&a[4]9

这样一对照,二级指针的逻辑就非常清楚了。

时间复杂度

  • 程序中只有一次for循环
  • 循环次数为n(这里是 5)

时间复杂度为:

O(n)

空间复杂度

  • 成绩数组a占用n个整型空间
  • 指针数组num占用n个指针空间
  • 额外只用了一个二级指针p

空间复杂度为:

O(n)

总结

这段代码真正想教你的不是“怎么多写几个星号”,而是:

  1. 指针数组适合用来管理多个分散的数据地址

  2. 二级指针非常适合统一遍历指针数组

  3. 这种写法在真实项目中很常见,比如:

    • 命令行参数argv
    • 多个字符串的统一管理
    • 多个数据块的集中处理

如果你现在回头再看教材里的示例,会发现它不再是“为了考试而存在”,而是一个能直接迁移到真实项目里的思想

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 5:06:40

使用Miniconda镜像降低GPU算力资源浪费的5个技巧

使用Miniconda镜像降低GPU算力资源浪费的5个技巧 在现代AI研发环境中&#xff0c;一个常见的尴尬场景是&#xff1a;你提交了一个训练任务&#xff0c;满怀期待地等待模型收敛&#xff0c;结果几分钟后收到告警——“torch not found”或“CUDA version mismatch”。更糟的是&…

作者头像 李华
网站建设 2026/4/23 6:24:26

基于gpt-oss-20b的轻量级大模型应用:低延迟响应的秘密

基于gpt-oss-20b的轻量级大模型应用&#xff1a;低延迟响应的秘密 在生成式AI席卷全球的今天&#xff0c;越来越多企业开始尝试将大语言模型&#xff08;LLM&#xff09;集成到产品中。但现实往往令人却步——高昂的API调用成本、动辄数百毫秒的响应延迟、以及对用户数据隐私的…

作者头像 李华
网站建设 2026/4/23 6:24:18

[watevrCTF 2019]Voting Machine 1

第一次打CTF——PWN篇学习笔记12int __fastcall main(int argc, const char **argv, const char **envp) {_BYTE v4[2]; // [rspEh] [rbp-2h] BYREF ​signal(14, sig);alarm(0x28u);puts("Hello and welcome to \x1B[3mour\x1B[23m voting application!");puts(&quo…

作者头像 李华
网站建设 2026/4/23 6:24:28

Java毕设选题推荐:基于Springboot+Vue的古风生活文化分享体验交流网站基于springboot古风生活体验交流网站的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/22 18:40:28

SQLPad查询缓存配置完全指南:如何让重复查询速度提升10倍

SQLPad查询缓存配置完全指南&#xff1a;如何让重复查询速度提升10倍 【免费下载链接】sqlpad Web-based SQL editor. Legacy project in maintenance mode. 项目地址: https://gitcode.com/gh_mirrors/sq/sqlpad 还在为每次执行相同SQL查询都要等待几秒钟而烦恼吗&…

作者头像 李华
网站建设 2026/4/23 6:24:46

10 个本科生论文写作工具,AI 工具推荐与对比

10 个本科生论文写作工具&#xff0c;AI 工具推荐与对比 论文写作的“三座大山”&#xff1a;时间、重复率与自我折磨 对于大多数本科生来说&#xff0c;论文写作从来不是一件轻松的事。从选题到文献综述&#xff0c;再到最终的成文和降重&#xff0c;每一个环节都像是一场持久…

作者头像 李华