C语言的编译系统都是将形参数组名作为指针指针变量来处理的,即指针变量写成数组形式。例如,下面两个函数的首部是等同的:
void sort(int arr[],int n)
void sort(int *arr,int n)
C语言中,一个程序执行时它的每个函数都会占用内存中一段连续的区域,每个区域都有一个入口地址(起始地址),一个函数的函数名就代表了该函数的入口地址,即由函数名表示的是函数指针常量。函数指针的类型与该函数的返回值类型必须一致。
定义一个指向函数的指针(简称函数指针)变量的一般形式为:
类型说明符 (*指针变量名)(形参类型表)
在定义指向函数的指针变量时,变量名外的括号不能缺少。
通过函数指针调用函数,调用的一般形式为:
(*函数指针变量名)(实参表列); //第一种
函数指针变量名(实参表列); //第二种
写一个简单的例子。
#include <stdio.h>
#include "stdlib.h"
int plus(int *, int);
int main() {
int i, n, sum = 0, *p = 0, *q = 0;
int (*p1)(int *, int); //定义返回值为整型的函数指针p1,参数为整型数组和数组的长度
printf("输入整型数组长度:");
scanf("%d", &n);
p = (int *)calloc(n, sizeof(int)); //申请动态空间
q = p; //将数组首地址存入q中
for (i = 0; i < n; i++) {
printf("请输入第%d个数字:", i + 1);
if (i != n - 1)
scanf("%d", p++);
if (i == n - 1)
scanf("%d", p);
}
p1 = plus; //p1指向函数plus
sum = p1(q, n); //使用函数指针p1调用函数plus
printf("数组元素之和为:%d", sum);
free(q);
}
/*编写函数,实现对数组内所有元素相加,并返回数组元素之和*/
int plus(int *p2, int numsSize) {
int i = 0, total = 0, *end = p2 + numsSize - 1;
for (i = 0; i < numsSize; i++) {
total += *p2;
if (p2 == end) // 设置条件,防止指针p2指向数组外
break;
p2++;
}
return total; //返回元素之和
}
输入和输出的结果。
定义形式 | 含义 |
int *p; | p为指向整型数据的指针变量,p是一个一级指针 |
int (*p)(); | p为一个指向函数的指针,该函数的返回值为整型数据 |
int *p(); | p为一个函数名,该函数的返回值为整数指针 |
int *p[n]; | p为数组名,数组由n个元素,每个元素为指向整型的指针 |
int (*p)[n]; | p为指向含有n个元素的一维数组的指针变量 |
int **p; | p为一个指针变量,它是指向一个整型指针的指针变量,即p为一个二级指针 |
void *p; | p为一个指针变量,基类型为void(空类型),不指向具体的对象 |