指针数组
首先我们要明白,他是一个数组,然后数组的里面存放的是指针。
例如,有10个整型指针,那么就可以定义一个指针数组把这10个指针放进去。
那么就可以定义成:
int *p[10];
数组指针
数组指针是一个指针,指向一个数组。
int a[6] = { 8, 2, 3, 4, 5, 6 };//首先定义一个数组
int(*p)[6] = &a; //定义一个数组指针指向这个数组
for (int i = 0; i < 6; i++){
printf("%d\n", (*p)[i]);//遍历取出数组的值并打印
}
函数指针
我们已经了解到,函数的调用会在栈上开辟空间,形成栈帧。既然开辟了空间就会在内存中有具体的位置,这既是函数的地址。即函数指针,如果我们想保存函数的指针该怎么办呢?那我们就得定义一个函数指针变量。
void fun(){ //定义一个函数
printf("hhhh\n");
}
int main(){
void(*pfun)() = &fun;//定义函数指针,并取fun()地址
printf("%p\n", &fun);//直接打印地址
printf("%p\n", pfun);//用函数指针打印地址
(*pfun)(); //通过函数指针调用函数
return 0;
}
函数指针数组
即数组里放的是函数的指针。
void fun1(){
printf("hhhh\n");
}
void fun2(){
printf("hhhh\n");
}
void fun3(){
printf("hhhh\n");
}
void fun4(){
printf("hhhh\n");
}
int main(){
void(*pfun[])() = { &fun1, &fun2, &fun3, &fun4 };//函数指针数组
printf("%p\n", &fun1);
printf("%p\n", pfun[0]);
(*pfun[0])();
(*pfun[1])();
指向函数的指针数组的指针
见名知义,不解释。
void(*p)[4]()=&pfun;
应用:用函数指针数组实现计算器
#include<stdio.h>
#include<Windows.h>
#pragma warning(disable:4996)
int add(int x, int y){
return x + y;
}
int sub(int x, int y){
return x - y;
}
int mul(int x, int y){
return x*y;
}
int div_(int x, int y){
if (x != 0)
return x / y;
}
int main(){
while (1){
int(*p[4])() = { add, sub, mul, div_ };//函数指针数组
printf("*****************\n");
printf("***0.add 1.sub***\n");
printf("***2.mul 3.div***\n");
printf("*** 5.exit ***\n");
printf("*****************\n");
printf("please select!\n");
int input;
scanf("%d", &input);
if (input >= 0 && input <= 4){
int x, y;
printf("plead input x,y:\n");
scanf("%d %d", &x, &y);
printf("计算结果为:%d\n",(*p[input])(x, y));
}
else if (input == 5) break;
else printf("input error!\n");
}
system("pause");
return 0;
}