学习:“指针数组”、“ 数组指针 ”、“函数指针”、“ 函数指针数组”、“指向函数指针数组的指针”

最近在学习指针数组、数组指针、函数指针、函数指针数组、指向函数指针数组的指针,其实看着眼晕,但理解起来,只要逻辑清晰,就还好啦~
接下来对上述进行总结:
**1 、指针数组:**
所谓指针数组,落点在数组上,就是类型是指针类型的数组。
例如:
int *arr[10];
char *arr[5]={"ab","cd","ef","gh","mn"};

这里写图片描述

**2.数组指针:**
所谓数组指针,落脚点是指针,指的是指针指向的是数组。指针在32位系统 下总是占用4个字节。
例如:
int (*p2)[10] = &arr;
这里,由于[]的优先级高于*号,因此p2在与*结合为指针变量时先加括号,指针指向一个数组,数组里有10个整型元素,而指针变量存储的是地址,因此将一个数组的地址赋给它。如下图所示:

这里写图片描述

**3.函数指针:**
所谓函数指针,就是函数的指针,落脚点是指针,指针指向一个函数。
例如:
char* fun1(char*p1,char*p2);
这里fun1是函数名,*fun1是指针,p1,p2是2个char*类型的指针变量,整个的返回值是char*类型的。
看以下程序:
```
#include <stdio.h>
#include<stdlib.h>

 int Add(int a, int b)
 {
    return a+b;
 }

 int main()
 {
    int (*pfun)(int , int) = Add;
    printf("%d\n", pfun(1, 2));
    system("pause");
    return 0;
 }
```
在主函数定义时,int (*pfun)(int , int)由于()优先级大于*号,是函数指针,函数指针指向函数名Add,即函数指针找到函数的地址,然后调用它。
**4.函数指针数组:**
所谓函数指针数组,落脚点是数组,数组的每个元素是函数指针的数组。
例如:
char*(*pf[3])(char *p);
这里(*pf[3])是前面说过的指针数组,pf是数组名,且数组内存储了3个指向函数的指针,这些指针指向一些返回值为指向字符的指针,参数为一个指向字符的指针的函数。
例如:
        #include <stdio.h>
        #include <string.h>
        char * fun1(char * p)
        {
          printf("%s\n",p);
          return p;
        }
        char * fun2(char * p)
        {
        printf("%s\n",p);
        return p;
        }
        char * fun3(char * p)
        {
        printf("%s\n",p);
        return p;
        }
        int main()
        {
        char * (*pf[3])(char * p);
        pf[0] = fun1; // 可以直接用函数名
        pf[1] = &fun2; // 可以用函数名加上取地址符
        pf[2] = &fun3;
        pf[0]("fun1");
        pf[0]("fun2");
        pf[0]("fun3");
        return 0;
        }

这里的char * fun1(char * p)
{
printf(“%s\n”,p);
return p;
}
用的是fun1是函数名,p是参数,是指向字符串指针,这里指的是指向字符的指针的函数,返回类型为char ,指向字符的指针。
这里写图片描述

**5.指向函数指针数组的指针:**
念着就好麻烦啊~,然而,落脚点是一个指针,这个指针指向一个数组,而这个数组存放的是函数指针,这样一层层剥开,就好理解了~
例如:
char*(*(*pf)[3])(char *p);
这里pf是个数组名,

这里写图片描述

这个指针指向一个包含了 3 个元素的数组;这个数字里面存的是指向函数的指针;这些指针指向一些返回值类型为指向字符的指针、参数为一个指向字符的指针的函数。
而剥开一层后,这样,就容易看很多,(*)一些返回值类型为指向字符的指针。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值