news 2026/5/15 1:01:38

C语言笔记三_函数指针_指针函数_数组指针_二级指针

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言笔记三_函数指针_指针函数_数组指针_二级指针

C语言笔记(三):数组指针、二级指针

一、指针数组 & 数组指针

1. 指针数组

本质:是一个数组。数组中的元素是指针,字符类型指针用得最多。

数据类型*数组名[整型常量];int*a[4];char*a[4]={NULL};char*b[5]={"hello","ok","how","are","you"};// 指针指向字符串常量区,只可读不可修改charstr[8][100]={"hello","ok","how","are","you"};char*str3[5]={str[0],str[1],str[3]};// 指针指向数组,可以读取可以修改

经验总结:

  • 存放字符串 → 使用字符数组
  • 操作字符串 → 使用指针
  • 存放多个字符串 → 使用二维字符数组
  • 操作字符串数组 → 使用指针数组

2. 数组指针

本质:指向数组的指针。

关键规则:

  • 对一维数组名执行取地址 &:地址值不变,类型升级为指向整个数组的指针
  • 对数组指针执行解引用 *:地址值不变,类型降级为指向第一个元素的指针
inta[5]={1,2,3,4,5};printf("a addr %p\n",a);// int * -> 首元素地址printf("&a %p\n",&a);// int (*)[5] -> 数组指针printf("&a+1 %p\n",&a+1);// 跳过整个数组int(*p)[5]=&a;// 数组指针
与二维数组配合使用
intarray2[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};int(*p2)[4]=array2;// 数组指针指向二维数组// 访问方式printf("a[1][2] %d\n",array2[1][2]);printf("a[1][2] %d\n",*(array2[1]+2));printf("a[1][2] %d\n",*(*(array2+1)+2));printf("p2[1][2] %d\n",p2[1][2]);printf("p2[1][2] %d\n",*(p2[1]+2));printf("p2[1][2] %d\n",*(*(p2+1)+2));// 类型对照// array2 -> int (*)[4] +1 -> sizeof(int) * 4 列// array2[0] -> int * +1 -> 第一行首元素地址 == &array2[0][0]// array2[0][0]-> int -> 数据// p2 -> int (*)[4]// p2[0] -> int *// p2[0][0] -> int// p2[1] -> *(p2 + 1) (下标运算符 = 解引用运算符)

三、二级指针

本质:指向指针的指针。

  • 定义指针变量时会开辟8字节空间,指针变量本身也有内存地址
  • 对一级指针取地址操作 → 获得二级指针
  • 需要解引用两次才能访问到数据

使用场景

场景传参类型
需要在被调函数中修改指针的指向(指针本身)传递二级指针
需要在被调函数中修改指针指向的内容传递一级指针
错误示例:一级指针无法修改指向
voidfun(char*arg_p){staticcharstr[10]="hello";arg_p=str;// ❌ 无法修改主调函数中指针的指向}intmain(intargc,char**argv){char*p=NULL;fun(&p);printf("p is %s\n",p);// NULLreturn0;}
正确示例:使用二级指针
voidfun2(char**arg_p){// 二级指针staticcharstr[10]="hello";*arg_p=str;// ✅ 可以修改主调函数中的指针}intmain(intargc,char**argv){char*p=NULL;fun2(&p);printf("p is %s\n",p);// helloreturn0;}

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

从Karpathy思维到PyTorch实战:掌握混合精度训练与AI工程核心技能

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫“karpathy-skills-anycoding”,作者是Vincent-A-Yang。光看这个名字,估计很多搞AI或者对编程感兴趣的朋友都会心头一动。“Karpathy”是谁?那是AI领域的大神&#…

作者头像 李华
网站建设 2026/5/15 0:53:17

通过用量看板观测Taotoken多模型调用成本与Token消耗

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过用量看板观测Taotoken多模型调用成本与Token消耗 对于中小项目的开发者而言,在集成大模型能力时,成本的…

作者头像 李华
网站建设 2026/5/15 0:48:56

Next.js复杂路由管理:fridays/next-routes库深度解析与实践指南

1. 项目概述:一个被低估的Next.js路由管理利器如果你正在使用Next.js开发一个需要复杂路由逻辑的应用,比如一个大型电商后台、一个内容管理系统,或者一个带有动态权限的SaaS平台,那么你很可能已经感受到了Next.js文件系统路由的“…

作者头像 李华
网站建设 2026/5/15 0:44:16

基于Adafruit NeoKey模块的可编程键盘DIY:从矩阵原理到CircuitPython实战

1. 项目概述:从零构建你的专属可编程键盘如果你和我一样,对市面上千篇一律的键盘感到审美疲劳,或者总想为特定的工作流(比如视频剪辑、3D建模、直播推流)打造一套专属的快捷键面板,那么自己动手做一个可编程…

作者头像 李华
网站建设 2026/5/15 0:44:12

工业意识:08 工厂为什么开始用手机监控?远程 SCADA 全解析

08 工厂为什么开始用手机监控?远程 SCADA 全解析 前面七篇咱们把监控大脑从车间大屏聊到汽车总装Andon,现在终于“长翅膀”了——老板在家沙发刷手机、工程师高铁上喝咖啡看数据、维修小哥工地巡检掏出平板,厂里啥情况一目了然!质量问题还想躲?手机叮一声报警推送,MES自…

作者头像 李华