一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第27天,点击查看活动详情。
指向函数的指针
什么是函数的指针
如果在程序中定义了一共函数,在编译时会把函数的源代码转换为可执行代码并分配一段存储空间。这段内存空间有一共起始地址,也称为函数的入口地址。每次调用函数时都从该地址入口开始执行此段函数代码。函数名代表函数的起始地址。 调用函数时,从函数名得到函数的起始地址,并执行函数代码。
函数名就是函数的指针,它代表函数的起始地址。
可以定义一个指向函数的指针变量,用来存放某一函数的起始地址,这就意味着此指针变量指向该函数。
int (*p)(int, int); // 定义p是一个指向函数的指针变量,它可以指向函数类型为整型且有两个整型参数的函数。此时,指针变量p的类型用int(*)(int, int)表示。
// *p两侧的括号不可省略,表示p先与*结合,是指针变量,然后再与后面的()结合,()表示函数,即该指针变量指向的是函数
用函数指针变量调用函数
如果想调用一个函数,除了可以通过函数名调用以外,还可以通过指向函数的指针变量来调用该函数。
main函数:
/**
* 用函数求整数a和b中的大值
* */
// // 通过函数名调用函数
// int max(int, int);
// int a, b, c;
// printf("please enter a and b: ");
// scanf("%d %d", &a, &b);
// c = max(a, b);
// printf("\na=%d\nb=%d\nmax=%d\n", a, b, c);
// 通过指针变量调用它所指的函数
int max(int, int);
int (*p)(int, int); // 定义指向函数的指针变量p p两侧的()不可省略,表示p先与*结合,是指针变量,然后再与后面的()结合,()表示函数,即该指针变量指向函数
int a, b, c;
p = max; // 使p指向max函数 将函数max的入口地址赋给指针变量p
printf("please enter a and b: ");
scanf("%d %d", &a, &b);
c = max(a, b);
printf("\na=%d\nb=%d\nmax=%d\n", a, b, c);
max函数:
int max(int a, int b) {
return a > b ? a : b;
}
怎样定义和使用指向函数的指针变量
定义指向函数的指针变量一般形式为:类型名 (*指针变量名)(函数参数表列),如 int (*p) (int, int)
用指向函数的指针作函数参数
指向函数的指针变量的一个重要用途是把函数的入口地址作为参数传递到其他函数。
返回指针值的函数
一个函数可以返回一个整型值、字符值、实型值等,也可以返回指针型的数据,即地址。
int *(int x, int y); a是函数名,调用它以后能得到一个int *型(指向整型数据)的指针,即整型数据的地址。x和y是函数a的形参,为整型。
- “*”两侧没有括号,在a的两侧分别为 * 运算符和()运算符
- ()优先级高于*,因此a先与()结合,这是函数形式
- 函数前面有一个 * , 表示此函数是指针型函数(函数值是指针)
- 最前面的int表示返回的指针指向整型变量
定义返回指针值的函数的原型的一般形式为:类型名 *函数名(参数表列)
- 指针是什么
- 指针变量
- 通过指针引用数组
- 通过指针引用字符串
- 指向函数的指针
- 返回指针值的函数
- 指针数组和多重指针
- 动态内存分配与指向它的指针变量
- 有关指针的小结