一、数组指针
顾名思义,数组指针就是指向数组的指针。形如: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;
}