总结函数指针,指针数组,数组指针,函数指针数组

函数指针:

顾名思义这是一个指针,不过指向的是一个函数。

定义:存储类型 返回值类型 (*指针变量名)(形参列表) 

初始化:

int (*p)(int x,int y)=func;//func为函数名,x和y为func函数的形参名

int (*p)(int x,int y)=&func;//含义上一行相同,不过一般不这么写

int (*p)(int ,int )=func;//func为函数名

上述代码解释:p是一个指针,它指向了一个返回值为int 型,有两个int型形参的函数。

赋值:

int (*p)(int x,int y)=func1;//func1为函数名,x和y为func函数的形参名

p=func2;//func2也是一个函数名

用途:通过函数指针来间接调用它所指向的函数,在回调函数中经常用到。

指针数组:

顾名思义这是一个数组,不过数组中存放的元素为指针。

定义:存储类型 数据类型 *数组名[数组元素个数]

eg:int *array[10];//定义了一个有10个int *类型的数组。[]的优先级比*优先级高

指针数组在char型中有很多用法。

eg:

char *str[3]={"Hi","Good","Moon"};

这是什么意思呢,str数组中有三个char *类型的元素。它们分别指向"Hi", "Good", "Moon"这三个字符串。即str[0]是一个指针指向"Hi" 这个字符串的首元素地址。

注意:关注它们的偏移量:str+1 和*str+1这两个偏移量是不同的,str+1指向了str这个数组的首元素的下个元素,即偏移到了str[1]这个元素。而*str+1则是先对str取内容,str这里代表数组首元素的地址(&str[0]),*str便是str[0],str[0]+1指向的是这个指针指向字符串的首元素的之后一个元素。

数组指针:

这是一个指针,它指向的是一个数组。

定义:存储类型 数据类型 (*数组名)[数组元素个数],因为[]的优先级比*高,所以要用()来使*的优先级变高

数组指针很多时候和二维数组搭上关系

eg:

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4]=a;

先来看p,p是一个指针,指向了一个有4个int类型数据的数组。a是一个二维数组,可以看作a内有三个其内有4个int型元素的数组。便于理解可以认为a[3][4]={a[0],a[1],a[2]};这里仅是便于理解,实际是不能这么写的。这个时候就可以知道int (*p)[4]=a; 的意思了。p指向了a的首元素地址(&a[0]);

来看偏移量:因为p指向的是a的首元素地址,所以p+1指向了a的第二个元素地址(&a[1])。

再看*p+1:*p便得到了a[0],而a[0]是a[0]这个数组的数组名,数组名在这里表示数组首元素地址。所以*p==&a[0][0];那么*p+1便指向了a[0][1]; 这就是偏移量的不同。那么**p是多少呢? **p==1(a[0][0]);

注意:由上可以知道p 和 *p的地址相同的,都是a[0][0]的地址,但是它们含义不同,偏移量是不同的。

函数指针数组

释义:这是一个数组,不过数组中的元素是函数指针

定义:返回值类型  (*数组名[N])(形参列表)

eg:

int (*p[5])(int ,int );
/*p是一个有5个元素的数组,
元素是指向返回值为int型,有两个int型形参的指针*/

可以通过函数指针数组来间接调用函数。上述的调用方式为: p[0](整型数,整型数 )或者*(p[0])(整型数 ,整型数 )。这两种方式都可以。

注意:因为这是一个数组,所以存放在其内的函数指针都是相同类型的,即指针指向的函数都是相同类型的。(相同类型的返回值,相同的形参个数和形参数据类型)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值