一、函数指针
函数指针是指向函数的指针变量。
通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。
函数指针可以像一般函数一样,用于调用函数、传递参数。
typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数、返回值的函数指针类型
实例:
int max(int x, int y)
{
return x > y ? x : y;
}
int main(void) { /* p 是函数指针 */
int (* p)(int, int) = & max; // &可以省略 int a, b, c, d;
printf("请输入三个数字:");
scanf("%d %d %d", & a, & b, & c); /* 与直接调用函数等价,d = max(max(a, b), c) */
d = p(p(a, b), c);
printf("最大的数字是: %d\n", d); return 0; }
输出结果为:
请输入三个数字:1 2 3
最大的数字是: 3
二、指针数组
本质上还是一个数组,里面存放的是指针。
定义方式如下:
<存储类型> 数据类型 * 指针数组名[N]
int * p[5];
char *p1[6];
实例:
#include <stdio.h>
const int MAX = 3;
int main ()
{
int var[] = {10, 100, 200};
int i, *ptr[MAX];
for ( i = 0; i < MAX; i++)
{
ptr[i] = &var[i]; /* 赋值为整数的地址 */
}
for ( i = 0; i < MAX; i++)
{
printf("Value of var[%d] = %d\n", i, *ptr[i] );
}
return 0;
}
结果如下:
Value of var[0] = 10
Value of var[1] = 100
Value of var[2] = 200
三、数组指针
本质上还是一个指针,只不过指向的是整个数组。
定义方式如下:
<存储类型> <数据类型> (*变量名)[数组元素的个数]
int a[9] = {1,2,3,4,5,6,7,8,9};
int (*p)[9] = &a;//int (*)[9]//p ==&a
(*p)[1];
int *q = a;
实例:
typedef int arr[3];
int main() {
arr b = {1, 2, 3};
int (*a)[3] = &b;
arr *c = a;
for (int i = 0; i < 3; ++i) {
printf("%d\n", (*a)[i]);
}
}
结果:
1
2
3
四、函数指针数组
本质还是个数组,用来存放函数指针。
可以和函数指针对比一下:
void (*funcPointerArray[3])(double x);//函数指针数组
void (*funcPointer)(double x);//函数指针
实例:
#include <stdio.h>
void addItem(char *name)
{
printf("Add %s successfully!\n",name);
}
void deleteItem(char *name)
{
printf("Delete %s successfully!\n", name);
}
void findItem(char *name)
{
printf("Find %s successfully!\n", name);
}
void updateItem(char *name)
{
printf("Update %s successfully!\n", name);
}
void main()
{
void(*funcPointerArray[4])(char *name);
funcPointerArray[0] = addItem;
funcPointerArray[1] = deleteItem;
funcPointerArray[2] = findItem;
funcPointerArray[3] = updateItem;
printf("Please enter a number(0-3) to continue:");
int num;
scanf_s("%d", &num,1);
printf("Please enter the name of the goods:");
char buf[128];
scanf_s("%s", &buf,128);
funcPointerArray[num](buf);
}