下面是使用函数指针的一个简单示例,其中函数接受一个整数参数并返回一个整数。我们也定义了square
函数,对一个整数求平方并返回值。为了简化例子,假定整数不会溢出。
int (*fptr1)(int);
int square(int num) {
return num*num;
}
要用函数指针来调用square
函数,需要把square
函数的地址赋给函数指针,如下所示。就像数组名字一样,我们用的是函数本身的名字,它会返回函数的地址。我们还声明了一个整数并将其传递给函数:
int n = 5;
fptr1 = square;
printf("%d squared is %d\n",n, fptr1(n));
执行代码后会显示”5 squared is 25.“。我们也可以像下面那样用取地址操作符对函数名进行操作,但是没必要这么做。在这种上下文环境中编译器会忽略取地址操作符。
fptr1 = □
下图说明了本例的内存分配。我们把square
函数放在程序栈下方。这只是举例子,实际上函数会被分配在跟程序栈所用段不同的段上。函数的实际地址通常对我们没用。
为函数指针声明一个类型定义会比较方便,下面说明对于之前用到的函数指针应该怎么做。类型定义看起来有点奇怪,通常,类型定义的名字是声明的最后一个元素。
typedef int (*funcptr)(int);
...
funcptr fptr2;
fptr2 = square;
printf("%d squared is %d\n",n, fptr2(n));