高级指针
(1)指针数组
简单来说就是存放指针的一个数组,是数组
例如 int*arr[10]
(2)数组指针
就是指向数组的一个指针,是指针,例如*p ,int(*p)[10]
写了一段简单代码
int main()
{
int arr[10] = { 0 };
int(*p)[10] = &arr;
system("pause");
return 0;
}
&arr
p内容
p存放的是数组地址。
(3)函数指针
任何函数都是有地址的,自然也会有存放函数地址的指针,就是函数指针
函数名代表函数地址,证明如下:
(4)函数指针数组
先在字面上理解一下,存放函数指针的一个数组,也就是存放函数地址的数组,是数组。
int (*p[20])();
计算器的实现就是函数指针数组的实例
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int divi(int a, int b)
{
return a / b;
}
void menu()
{
printf("---------------------------------\n");
printf("------1.add 2.sub------\n ");
printf("------3.mul 4.div------\n ");
printf("---------------------------------\n");
printf("请选择:");
}
int main()
{
int x = 0;
int y = 0;
int input = 1;
int ret = 0;
char a[5] = { '0', '+', '-', '*', '/' };
int(*p[5])(int x, int y) = { 0, add, sub, mul, divi }; //定义一个函数指针数组存放函数地址
while (input)
{
menu();
scanf("%d", &input);
if (input == 0)break;
if (input > 0 && input < 5)
{
printf("请输入操作数:");
scanf("%d %d", &x, &y);
ret = (*p[input])(x, y);
}
else{
printf("输入错误!\n");
}
printf("%d %c %d = %d\n", x, a[input], y, ret);
}
system("pause");
return 0;
}
(5)指向函数指针数组的指针
这个指针指向一个函数指针数组,指针存放的内容是函数指针数组的地址,是指针。
Void(*(*p)[10])()