
🍀指尖燃热血,代码铸锋芒;以信仰破局,向顶峰生长
🎬秦苒&的简介:

前言:
文章目录
- 一、数组指针变量
- 二、二维数组传参本质
- 三、函数指针变量
-
- [3.1 函数指针变量的创建](#3.1 函数指针变量的创建)
- [3.2 函数指针变量的使用](#3.2 函数指针变量的使用)
- 3.3typedef关键字
- 四、函数指针数组
- 总结
- 结尾
提示:以下是本篇文章正文内容,下面案例可供参考
一、数组指针变量
1.1什么是数组指针变量
什么是数组指针呢?顾名思义就是指向数组的指针,其变量是指针变量。数组指针变量存放的是数组的地址。
这里我们着重对比一下对比:指针数组是元素为指针的数组,数组中存放的是地址(指针)。
老办法,照猫画虎!!
• 整形指针变量: int * pint; 存放的是整形变量的地址,能够指向 整形 数据的指针。
• 浮点型指针变量: float * pf; 存放浮点型变量的地址,能够指向浮点 型数据的指针。
虎--->数组指针变量:存放的应该是数组的地址,能够指向数组的指针变量
语法格式

c
int (*p)[10];//[]的优先级要⾼于*号的,所以必须加上()来保证p先和*结合
注意:p先和*结合,说明p是⼀个指针变量,然后指针指向的是一个大小为10个整型的数组。所以p是⼀个指针,指向⼀个数组,叫数组指针。
2.2数组指针变量怎么初始化
我们怎么获得数组的地址呢?
c
int arr[10] = {0};
&arr;//得到的就是数组的地址
如果要存放整个数组的地址,就得存放在数组指针变量中
c
int(*p)[10] = &arr;
二、二维数组传参本质
之前,我们有⼀个二维数组的需要传参给⼀个函数的时候,我们是这样写的:

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

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

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

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

嗯···看来函数是有地址的。函数名就是函数的地址,当然也可以通过 &函数名 的方式获得函数的地址
函数指针类型解析:

其实我觉得学习指针用到好多照猫画虎的思想,嗯,这个也是:
如果我们要将函数的地址存放起来,就得创建函数指针变量咯,函数指针变量的写法其实和数组指针非常类似,我们继续看图:
c
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 就方便多了,那么我们可以使用:
c
typedef unsigned int uint;
//将unsigned int 重命名为uint
那如果是指针类型,能否重命名呢?其实也是可以的,比如,将 int* 重命名为 ptr_t ,这样写:
c
typedef int* ptr_t;
但是对于数组指针和函数指针稍微有点区别:
比如我们有数组指针类型 int(*)[5] ,需要重命名为 parr_t ,那可以这样写
c
typedef int(*parr_t)[5]; //新的类型名必须在*的右边
照猫画虎,函数指针类型的重命名也是⼀样的,比如,将 void(*)(int) 类型重命名为 pf_t ,就可以这样写:
c
typedef void(*pfun_t)(int);//新的类型名必须在*的右边
可以简化为
c
pfun_t signal(int, pfun_t);
四、函数指针数组
数组是⼀个存放相同类型数据的存储空间,我们已经学习了指针数组
比如:
c
int * arr[10];
//数组的每个元素是int*
把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组
看这个:
c
int (*parr1[3])();
int *parr2[3]();
int (*)() parr3[3];
parr1 先和 [] 结合,说明parr1是数组,是 int (*)() 类型的函数指针
总结
围绕C语言中数组指针、函数指针相关的核心知识点展开系统讲解,从基础概念到实际应用,层层拆解了指针体系中这两类易混淆的重要内容,清晰梳理了其定义、
结尾
勇敢的寻宝者啊,这次旅途你挖掘到多少宝藏呢,苒苒很期待下次与您相遇!
结语:希望对寻找C语言相关内容的寻宝者有所帮助,不要忘记给博主"一键三连"哦!你的每一次鼓励都为我提供 了前行的动力!
小喵很期待与你再次寻宝奥 ᰔᩚ/•᷅•᷄\୭
