一、指针函数与函数指针的比较
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
来源:简书