C语言中的指针和函数是其核心特征之一。它们能够提供强大的灵活性和扩展性,对于C语言程序的开发非常重要。在C语言中,还有两个与指针和函数有关的概念需要进一步了解,即函数指针和指针函数。
1、函数指针
1.1
函数指针是指向函数的指针变量。它允许通过变量名引用函数,而不是通过函数名。在C语言中,函数名实际上是函数代码的内存地址。因此,函数指针存储着代码段中相应的地址。使用函数指针可以方便地在代码中传递和使用函数作为参数,也可以在程序运行时动态地指定需要调用的函数。
在C语言中,函数指针的声明方式比较特殊。例如,以下是一个简单的函数指针:
```
int (*funcPtr)(int, int);
```
上面的声明意味着“funcPtr”是一个指向函数的指针变量,该函数返回类型为int,并且接受两个整型参数。
为了调用该函数指针,需要将其指向需要调用的函数。例如,以下代码演示了如何将函数指针指向一个函数:
```
int add(int x, int y) {
return x+y;
}
int (*funcPtr)(int, int);
funcPtr = add;
``
通过将“add”函数的地址赋给函数指针“funcPtr”,现在可以通过“funcPtr”变量调用“add”函数了:
```
int result = (*funcPtr)(2, 3);
```
在这里,“result”变量等于5,即调用“add”函数传递整型参数2和3的结果。
=====================================================
1.2
定义
我们看个代码
int *func(int a,int b)
我们之前说过运算符的优先级,*的优先级低于(
由于“*”的优先级低于“()”的优先级,因而func首先和后面的“()”结合,也就意味着,func是一个函数。即:
int *(func)(int a,int b)
然后这个函数的返回值的类型是 int * 即:指向int类型的指针
然后我们这样修改上面的代码
int (*func)(int a,int b)
(*func)说明func是一个指针,然后后面跟着()说明这个指针指向一个函数,即函数指针。
所以
函数指针:首先是一个指针,这个指针指向一个函数
指针函数:首先是一个函数,这个函数的返回值一个指针
用typedef声明一个函数指针
我们声明一个函数指针,正常方法是
int (*pfunc)(int a,int b)
当我们命名很多个函数指针的时候,用上面的方法显得非常不方便,所以我们可以这样做
typedef int (*PF) (int a,intb)
PF pfunc;
例程:
#include "stdio.h"
typedef int(*PF)(int, int);
int add(int a, int b)
{
return a + b;
}
int reduce(int a, int b)
{
return a - b;
}
int main()
{
PF pfunc = NULL;
pfunc = add;
printf("add:%d\n",pfunc(3, 4));
pfunc = reduce;
printf("reduce:%d\n", pfunc(3, 4));
/*getchar是用VS编写方便查看输出*/
getchar();
return 0;
}
2、指针函数
指针函数是返回指针的函数。它允许返回指向指针的指针,也可以返回指针数组。指针函数可以用于动态内存分配、数据结构遍历等场景。此外,它也可以浓缩代码思路,提高代码的可读性和可维护性。
以下是一个示例指针函数:
```
int* getArray() {
static int arr[3] = {1, 2, 3};
return arr;
}
```
该函数返回一个指向整型数组的指针。在程序中,指针函数可以像另一个指针变量一样使用,代码可以按以下方式访问函数返回的数组中的元素:
```
int* arrPtr = getArray();
for(int i=0; i<3; i++) {
printf("%d ", arrPtr[i]);
}
```
运行结果是:1 2 3
在本例中,指针函数实现了一个静态整型数组,然后返回一个指向该数组的指针。相应地,指针变量“arrPtr”指向该数组的地址。最后,使用“arrPtr”指针来访问数组中的元素。
小结
函数指针和指针函数是C语言中两个不同的核心概念。使用函数指针可以方便地传递和使用函数作为参数,而使用指针函数可以返回指向指针的指针或指向指针数组的指针。两者都是对C语言功能的补充,可以提高代码的易用性和灵活性。