指针数组,数组指针,函数指针,函数指针数组,指向函数指针数组的指针的理解

指针数组

首先我们要明白,他是一个数组,然后数组的里面存放的是指针。

例如,有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;
}

猜你喜欢

转载自blog.csdn.net/weixin_41891854/article/details/80515773