一、指针函数
1.返回指针的函数称为指针函数
2.指针函数的定义
一般形式为:
类型说明符 *函数名(形参表){
/*函数体*/
}
例如:
//返回两个数中最大数的地址
int *sum(int a, int b){
return a > b ?&a : &b;
}
int *sum2(int *a, int *b){
return *a > *b ? a: b;
}
int main(int argc, const char * argv[])
{
int a = 10,b = 9;
//传值给函数
printf("Address of a = %p\n", &a);
printf("Address of b = %p\n", &b);
printf("传值给函数Address of the biger = %p\n", sum(a, b));
//传地址给函数
printf("传地址给函数Address of the biger = %p\n", sum2(&a, &b));
return 0;
}
打印结果:
Addressof a = 0x7fff5fbff90c
Addressof b = 0x7fff5fbff908
传值给函数Address ofthe biger = 0x7fff5fbff8dc
传地址给函数Address ofthe biger = 0x7fff5fbff90c
分析:由打印结果可知实参和形参完全是两码事,在内存中占用的地址都不一样。
二、函数指针
1.函数指针概念
在C语言中,一个函数总是占用一段连续的内存空间。而函数名就是该函数所占内存空间的首地址。
我们可以把函数的这个首地址(或称入口地址)赋予一个指针,使该指针变量指向该函数,然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针称为“函数指针变量”
2.函数指针定义方法
一般形式为:
函数的声明:
返回值类型 (*变量名)(函数的参数列表);
例如:
int test(int a,int b){
return a + b;
}
//定义了一个函数指针
//p可以存放返回值类型是int,且有两个形参,形参类型都是int类型的函数的地址
int main(int argc, const char * argv[])
{
int a = 10,b = 9;
//定义了一个函数指针
//p可以存放返回值类型是int,且有两个形参,形参类型都是int类型的函数的地址
int (*p)(int a, int b);
p = test;
return 0;
}
3.函数指针的使用
例如:
#include
//returna + b
int add(int a, int b){
return a + b;
}
//returna - b
int sub(int a, int b){
return a - b;
}
//returna * b
int mul(int a, int b){
return a * b;
}
//returna / b
int divd(int a, int b){
return a / b;
}
int main(int argc, const char * argv[])
{
int a = 10,b = 9;
//定义了一个函数指针
//p可以存放返回值类型是int,且有两个形参,形参类型都是int类型的函数的地址
int (*p)(int a, int b);
//根据b的不同取值,使p指向不同的函数,这样可以是代码更清晰简洁。
switch (b) {
case 0:
case 1:
case 2:
case 3:
p = sub;
break;
case 4:
case 5:
case 6:
p = add;
break;
case 7:
case 8:
p = mul;
break;
default:
p = divd;
break;
}
printf("result = %d", p(a, b));
return 0;
}
4.注意事项
1)函数指针变量不能进行算术运算,这是与数组指针变量不同的地方。数组指针变量加减一个整数可使指针移动指向后面或者前面的数组元素,而函数指针的移动式毫无意义的。
2)函数调用中“(*指针变量名)”的两边的括号不可少,其中的*不应该被理解为求值运算,此处它只是一种表示符号。