指针函数、函数指针、指针数组、数组指针及复杂指针组合

一、指针函数与函数指针的比较

1.概念

 函数指针:主体为指针,指向一个函数

指针函数:主体为函数,返回类型为指针

int  *f(int x,int y);   指针函数,因为括号优先级大于*,f先和括号结合,成为函数,返回一个指针。

int (*f)(int x,int y);函数指针,在括号内,是一个指针,指向的是一个函数。

注:()的优先级大于*

2.运行代码

①函数指针:

int add(int x, int y) {
	return x + y;
}
int sub(int x, int y) {
	return x - y;
}
//函数指针
int(*f)(int x, int y);

int main() {
	f = add;
	printf("1+2=%d\n", (*f)(1, 2));
 
	f = sub;
	printf("1-2=%d\n", (*f)(1, 2));
	system("pause");
	return 0;
}

②指针函数

int c;
int *add(int x, int y) {
	c=x + y;
	return &c;
}
int *sub(int x, int y) {
	c=x - y;
	return &c;
}

int *(*f)(int x, int y);

int main() {
	f = add;
	printf("1+2=%d\n", *(*f)(1, 2));

	f = sub;
	printf("1-2=%d\n", *(*f)(1, 2));
	system("pause");
	return 0;
}

3.注意事项

不要返回局部变量的指针

 

二、指针数组与数组指针的比较

指针数组:是数组,每个元素都是指针。

数组指针:是指针,即一个指向数组的指针。

int *p[3];//指针数组

int [3]*p;//数组指针

注:[]的优先级大于*,所以数组指针的形式为中括号在前面

 

三、复杂指针

int (*p)[3];   

1,从变量名p开始,p*被括号包裹,所以优先组合括号里面,*p组合成一个指针,所以p是一个指针,指向类型未知
2,再看括号外面,把(*p)当做一个整体,右边是[3],所以指针p指向了一个数组,数据元素类型未知
3,把(*p)[3]当做一个整体,左边是int,所以这个数组的元素类型是int
4,所以,p是一个指向了有3个int型元素的数组的指针

int(*p)(int);

1,从p开始,*p被括号包裹,优先运算组合成一个指针,指针指向类型未知
2,然后再看右边(int),指针p指向了一个参数类型为int的函数,函数返回值类型未知
3,把(*p)(int)当一个整体,看左边int,得知这个函数的返回值类型为int
4,所以,p是一个指向了参数类型为int,返回值类型为int的函数的指针

int(*(*p())[])();

1,从p开始,p右边有个括号,所以p还是一个函数,函数返回值类型未知
2,把p()当一个整体,看左边*,得知这个函数的返回值类型是一个指针,指针指向类型未知
3,把(*p())当一个整体,右边的[ ]比左边的*优先级高,所以优先与[ ]组合,得知指针指向的是一个数组,数组元素类型未知
4,把(*p())[]当一个整体,看左边*得知,数组元素类型是一个指针
5,把(*(*p())[])当一个整体,看右边()得知,数组元素的指针指向的是一个函数
6,最左边的int说明这个函数的返回值是int类型
7,所以,p是一个返回值为指向了一个数组的指针类型的函数,这个数组的元素类型为指向了一个返回值为int型的函数的指针

复杂指针部分作者:有兴不虚昧
链接:https://www.jianshu.com/p/30bfb7fbc3e8
来源:简书

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值