int main(){
int arr[3] = {1,2,3};
int (*parr)[3] = &arr;
return 0;
}
4、指针数组 -- 存放指针的数组,本质就是数组。
int* arr[ ];
cpp复制代码
int main(){
int a[] = {1,2,3,4,5};
int b[] = {2,3,4,5,6};
int c[] = {3,4,5,6,7};
int* arr[] = {a,b,c};
for(int i=0;i<3;i++){
for(int j=0;j<5;j++){
printf("%d ",*(arr[i] + j));
}
printf("\n");
}
return 0;
}
二、函数指针
1、理解
指向函数地址的指针
2、写法
函数返回类型 (* p)(参数1、参数2、...)
3、举例
cpp复制代码
int Add(int x,int y){
return x + y;
}
int main(){
int (*p)(int ,int ) = &Add;
printf("%p\n",&Add);
printf("%p\n",Add);
return 0;
}
在前面一节中将到了 数组名和&数组名的区别、但在这里 函数名 == &函数名。
4、使用
由于 函数名 == &函数名。所以可以有多种调用方法。
int Add(int x,int y){
return x + y;
}
int main(){
int (*p)(int ,int ) = &Add;
int ret = (*p)(20,6);
// int ret = p(20,6);
// int ret = Add(20,6);
printf("%d\n",ret);
return 0;
}
5、试解析下列的一段代码
(*(void ( * ) () ) 0 ) ( ) ;
三、函数指针数组
1、理解
存放函数指针的数组、存放同类型的函数指针。
2、写法
函数返回类型 (* pArr [ ])(参数1、参数2、...)
3、举例 -- 简单计算器的实现
void menu(){
printf("***********************\n");
printf("*****1、Add 2、Sub**\n");
printf("*****3、Mul 4、Div**\n");
printf("***** 0、exit **\n");
printf("***********************\n");
}
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){
return x / y;
}
int main(){
int input = 0;
do{
int x = 0, y = 0, ret = 0;
int (*parr[5])(int, int) = {NULL,Add,Sub,Mul,Div};
menu();
printf("请选择要实现的功能:");
scanf("%d",&input);
if(input >= 1 && input <=4){
printf("请输入两个操作数:");
scanf("%d %d",&x , &y);
ret = (*parr[input])(x,y);
printf("ret=%d\n",ret);
}else if(input == 0){
printf("退出程序\n");
break;
}else{
printf("输入错误,重新输入\n");
}
}while(input);
return 0;
}