【1】指针数组和数组指针
指针数组:望文生义就是一个数组成员为指针的数组。
int *arr1[10];
char *arr2[10];
运算符*的优先级低于”[ ]”,所以说变量名先和哪个运算符结合就表示哪种类型,比如上面arr1先和”[ ]”结合,则表示它是一个数组,是一个数组成员为指针的数组,而数组指针同样,看结合的对象
int(*p1)[10];
char(*p2)[10];
“( )”优先级最高,p1先和*结合,则表示他是一个指针,指向一个数组,即数组指针
【应用】:
int arr[10] = { 0 };
int*p1 = &arr;//ok?
int (*p2)[10] = &arr;//ok?
显而易见arr的地址用p2存放合适,&arr表示数组的地址,某类型的地址用该类型的指针指向合适,即数组指针。
【2】函数指针
望文生义:指向函数的指针
如上图一样,函数也有地址,那么函数的地址应该怎样保存。
和数组一样,函数也有自己的保存方式,即函数指针,(存放函数的地址)指向一个函数的指针。
void test()
{
printf("小胖墩\n");
}
//怎样保存函数test的地址
void (*p1)();
//说明p1是指针,指向一个函数,指向的函数无参数,返回值类型是void
【应用】:
1.char * *fun1(char p1,char p2);
2.char *(*fun2)(char *p1,char *p2);
fun1先和( )结合,所以fun1是一个函数,是一个由两个参数构成的,返回值类型为char** 型的函数;fun2先和结合,所以fun2是一个指针,指向一个函数,(函数为两个参数,返回值类型为char)。
【3】函数指针数组和函数指针数组的指针
1.函数指针数组:一个数组,里面存放的是函数的地址(函数指针)
int(*arr[10])(int a);
arr是一个数组名,arr数组内有十个函数指针,这些指针指向一个参数为int型,返回值类型为int的函数。
2.函数指针数组的指针:一个指针,指向一个数组,数组里面存放的是函数的地址(即指向函数的指针)
char (*(*arr)[5])(char* a, char* b);
arr是个指针,指向一个数组,数组里面有五个函数指针,这些函数指针指向参数为插入char*,返回值类型为char的函数。
【应用】:计算器
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 Div(int a, int b)
{
return a / b;
}
int main()
{
int x = 0, y = 0;
int input = 0;
int ret = 0;
int(*arr[5])(int x, int y) = { 0,Add,Sub,Mul,Div };//函数指针数组,存放函数地址的数组
printf("-----------------------\n");
printf("1.Add 2.Sub\n");
printf("3.Mul 4.Div\n");
printf("-----------------------\n");
do
{
printf("请选择>");
scanf("%d", &input);
if (input >= 1 && input <= 4)
{
printf("请输入数字>");
scanf("%d %d", &x, &y);
ret = (*arr[input])(x, y);
printf("ret=%d\n", ret);
}
else
printf("error\n");
} while (input);
system("pause");
return 0;
}