首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【C语言指针四】数组指针变量、二维数组传参本质、函数指针变量、函数指针数组

【C语言指针四】数组指针变量、二维数组传参本质、函数指针变量、函数指针数组

作者头像
用户11987028
发布2026-01-15 14:12:38
发布2026-01-15 14:12:38
1210
举报

-

在这里插入图片描述
在这里插入图片描述

🎬 个人主页秦苒&专栏传送门:《C语言

🍀指尖燃热血,代码铸锋芒;以信仰破局,向顶峰生长


🎬秦苒&的简介:

在这里插入图片描述
在这里插入图片描述

前言:


提示:以下是本篇文章正文内容,下面案例可供参考

一、数组指针变量

1.1什么是数组指针变量

什么是数组指针呢?顾名思义就是指向数组的指针,其变量是指针变量。数组指针变量存放的是数组的地址。 这里我们着重对比一下对比:指针数组是元素为指针的数组,数组中存放的是地址(指针)。 老办法,照猫画虎!! • 整形指针变量: int * pint; 存放的是整形变量的地址,能够指向 整形 数据的指针。 • 浮点型指针变量: float * pf; 存放浮点型变量的地址,能够指向浮点 型数据的指针。 虎—>数组指针变量:存放的应该是数组的地址,能够指向数组的指针变量

语法格式

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
int (*p)[10];//[]的优先级要⾼于*号的,所以必须加上()来保证p先和*结合

注意:p先和*结合,说明p是⼀个指针变量,然后指针指向的是一个大小为10个整型的数组。所以p是⼀个指针,指向⼀个数组,叫数组指针

2.2数组指针变量怎么初始化

我们怎么获得数组的地址呢?

代码语言:javascript
复制
int arr[10] = {0};
&arr;//得到的就是数组的地址 

如果要存放整个数组的地址,就得存放在数组指针变量中

代码语言:javascript
复制
int(*p)[10] = &arr;

二、二维数组传参本质

之前,我们有⼀个二维数组的需要传参给⼀个函数的时候,我们是这样写的:

在这里插入图片描述
在这里插入图片描述

接下来我们再学习一个新方法: 我们先回顾一下有关二维数组的知识。 怎么理解二维数组呢—>二维数组其实可以看做是每个元素是⼀维数组的数组,也就是二维数组的每个元素是一个一维数组。那么,二维数组的首元素就是第一行,是个⼀维数组。

我们结合图片理解一下:

在这里插入图片描述
在这里插入图片描述

继续我们的照猫画虎的思想!!根据数组名是数组首元素的地址这个规则,二维数组的数组名表示的就是第一行的地址,是一维数组的地址 第一行的⼀维数组的类型就是 int [5] ,所以第一行的地址的类型就是数组指针类型 int(*)[5] 。也就是说二维数组传参本质上也是传递了地址,传递的是第一行这个一维数组的地址,那么形参也是可以写成指针形式的。如下图所示:

在这里插入图片描述
在这里插入图片描述

于是,我们得到结论: 二维数组传参,形参的部分可以写成数组,也可以写成指针形式

在这里插入图片描述
在这里插入图片描述

三、函数指针变量

3.1 函数指针变量的创建

什么是函数指针变量呢 函数指针变量就是用来存放函数地址的,未来通过地址能够调用函数的 地址?函数有地址吗?实践是检验真理的唯一标准

在这里插入图片描述
在这里插入图片描述

嗯···看来函数是有地址的。函数名就是函数的地址,当然也可以通过 &函数名 的方式获得函数的地址

函数指针类型解析:

在这里插入图片描述
在这里插入图片描述

其实我觉得学习指针用到好多照猫画虎的思想,嗯,这个也是: 如果我们要将函数的地址存放起来,就得创建函数指针变量咯,函数指针变量的写法其实和数组指针非常类似,我们继续看图:

代码语言:javascript
复制
void test()
{
 printf("hehe\n");
}
void (*pf1)() = &test;
void (*pf2)()= test;
int Add(int x, int y)
{
 return x+y;
}
int(*pf3)(int, int) = Add;
int(*pf3)(int x, int y) = &Add;//x和y写上或者省略都是可以的 

3.2 函数指针变量的使用

在这里插入图片描述
在这里插入图片描述

3.3typedef关键字

typedef是用来类型重命名的,可以将复杂的类型,简单化。 举个例子: 比如,你觉得 unsigned int 写起来不方便,如果能写成 uint 就方便多了,那么我们可以使用:

代码语言:javascript
复制
typedef unsigned int uint;
//将unsigned int 重命名为uint 

那如果是指针类型,能否重命名呢?其实也是可以的,比如,将 int* 重命名为 ptr_t ,这样写:

代码语言:javascript
复制
typedef int* ptr_t;

但是对于数组指针和函数指针稍微有点区别: 比如我们有数组指针类型 int(*)[5] ,需要重命名为 parr_t ,那可以这样写

代码语言:javascript
复制
typedef int(*parr_t)[5]; //新的类型名必须在*的右边

照猫画虎,函数指针类型的重命名也是⼀样的,比如,将 void(*)(int) 类型重命名为 pf_t ,就可以这样写:

代码语言:javascript
复制
typedef void(*pfun_t)(int);//新的类型名必须在*的右边

可以简化为

代码语言:javascript
复制
pfun_t signal(int, pfun_t);

四、函数指针数组

数组是⼀个存放相同类型数据的存储空间,我们已经学习了指针数组 比如:

代码语言:javascript
复制
int * arr[10];
//数组的每个元素是int* 

把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组 看这个:

代码语言:javascript
复制
int (*parr1[3])();
int *parr2[3]();
int (*)() parr3[3];

parr1 先和 [] 结合,说明parr1是数组,是 int (*)() 类型的函数指针


总结

围绕C语言中数组指针、函数指针相关的核心知识点展开系统讲解,从基础概念到实际应用,层层拆解了指针体系中这两类易混淆的重要内容,清晰梳理了其定义、

结尾

勇敢的寻宝者啊,这次旅途你挖掘到多少宝藏呢,苒苒很期待下次与您相遇!

结语:希望对寻找C语言相关内容的寻宝者有所帮助,不要忘记给博主“一键三连”哦!你的每一次鼓励都为我提供 了前行的动力!

小喵很期待与你再次寻宝奥 ᰔᩚ/•᷅•᷄\୭

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、数组指针变量
    • 1.1什么是数组指针变量
    • 2.2数组指针变量怎么初始化
  • 二、二维数组传参本质
  • 三、函数指针变量
    • 3.1 函数指针变量的创建
    • 3.2 函数指针变量的使用
    • 3.3typedef关键字
  • 四、函数指针数组
  • 总结
  • 结尾
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档