一、数组指针
顾名思义,数组指针就是指向数组的指针。形如:int (*p)[10];
注意:[]的优先级要高于*号的,所以必须加上()来保证p先和*结合。
数组指针的使用
int arr[10] = {0};
int (*parr)[10] =&arr; //数组指针的使用| | || | || | parr指向数组的元素个数| parr是数组指针变量名parr指向的数组的元素类型
二、二维数组传参的实质
首先我们再次理解⼀下二维数组,二维数组起始可以看做是每个元素是⼀维数组的数组,也就是二维数组的每个元素是⼀个⼀维数组。那么二维数组的首元素就是第⼀行,是个⼀维数组。
⼆维数组传参本质上也是传递了地址,传递的是第⼀行这个⼀维数组的地址,那么形参也是可以写成指针形式的。
#include <stdio.h>
void test(int (*p)[5], int r, int c)
{int i = 0;int j = 0;for(i=0; i<r; i++){for(j=0; j<c; j++){printf("%d ", *(*(p+i)+j));}printf("\n");}
}int main()
{int arr[3][5] = {{1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7}};test(arr, 3, 5);return 0;
}
⼆维数组传参,形参的部分可以写成数组,也可以写成指针形式。
三、函数指针
根据前面学习整型指针,数组指针的时候,我们的类比关系,我们不难得出结论:函数指针变量应该是用来存放函数地址的,可以通过地址能够调用函数的。
int (*pf) (int x, int y)| | || | || | pf指向函数的参数类型和个数的交代| 函数指针变量名pf指向函数的返回类型int (*) (int x, int y) //pf函数指针变量的类型
函数指针的使用
#include <stdio.h>
int Add(int x, int y)
{return x+y;
}
int main()
{int(*pf)(int, int) = Add;printf("%d\n", (*pf)(2, 3));printf("%d\n", pf3(3, 5));//这两种方式均可以return 0;
}
四、函数指针数组及其应用
把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组。定义形式int (*parr1[3])();
转移表
#include <stdio.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 div(int a, int b)
{return a / b;
}
void menu()
{printf("*************************\n");printf("*****1:add 2:sub ****** \n");printf("*****3:mul 4:div *******\n");printf("*****0:exit ****** \n");printf("*************************\n");
}
int main()
{int x, y;int input = 0;int ret = 0;int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表 do{printf( "请选择:" );scanf("%d", &input);if ((input <= 4 && input >= 1)){printf( "输⼊操作数:" );scanf( "%d %d", &x, &y);ret = (*p[input])(x, y);printf( "ret = %d\n", ret);}else if(input == 0){printf("退出计算器\n");}else{printf( "输⼊有误\n" ); }}while (input);return 0;
}