目录
1、数组指针和指针数组
指针数组:是一个数组,用来存放指针。
int *arr[10]={0};
数组指针:是一个指针,指向数组。
int arr[10]={0};
int *p=&arr;
int (*p)[5]={0};// p先和*结合,说明p是一个指针变量,指向数组,然后与操作符[]结合,访问数组中的元素。
2、数组名和&数组名的区别
数组名代表数组首元素的地址,&数组名表示的是整个数组的地址。虽然二者的值都是一样,但是二者值得含义不一样。
int arr[10]={0};
arr+1 表示跳过一个一个数组元素。
&arr+1 表示跳过一整个数组
如图:
3、参数传递
一维数组传参
int arr[10]={0};
test(arr)
arr是数组名,代表数组元素的首地址,既然传过去是个地址,那么不仅可以用形参数组接收也可以用指针接收。
参数写法:
1、test(int arr[])
形参的 int arr[] 看起来是个数组,实际上并不是,它是一个空间的地址。
2、test(int arr[10])
3、test(int* p)
二维数组传参:
int arr[3][5];
arr,二维数组的元素名,表示数组首元素的地址,但是二维数组的数组名表示第一行元素的地址。是一维元素的地址
1、test(int arr[3][5])
2、test(int arr[][5])
可以不必知道二维元素有几行,但是必须知道二维数组有几列。行可省略,列不能省略。
3、test(int (*arr)[5]) 数组指针
一级指针传参:
int a=10;
int *p=&a;
test(p);
test(int *p)
二级指针传参
int a=10;
int *p=&a;
int **pp=&p;
test(pp);
test(int **p);
二级指针存放的是一级指针的地址
4、函数指针
指向函数的指针,存放的是一个函数的地址,
void test(int a,int b);
void (*ptr)(int,int)=&test;
ptr 先与操作符*结合,表示ptr是一个指针,存放的是函数test的地址,后面的(int ,int )表示指向的函数中有两个整型的变量。void 表示指向的函数。
函数指针数组:存放的类型都是函数指针的数组,是一个数组。
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 (*pf1)(int, int) = Add;
int (*pf2)(int, int) = Sub;
int (*pf3)(int, int) = Mul;
int (*pf4)(int, int) = Div;
用数组表示为: int *(pf[])(int,int)={Add,Sub,Mul,Div};
用法:
int i = 0;
for (i = 0; i < 4; i++)
{
int ret = arr[i](2, 8);
printf("%d", ret);
}
2和8在加减乘除。
5、用C语言简单实现计算器
void menu()
{
printf("*******************\n");
printf("*******1>Add****\n");
printf("*******2>Sub****\n");
printf("*******3>Mul****\n");
printf("*******4>Div****\n");
printf("*******0.exit******\n");
printf("*******************\n");
}
int main()
{
int input = 0;
int (*arr[])(int, int) = { NULL,Add,Sub,Mul ,Div };
int x = 0;
int y = 0;
do
{
menu();
printf("请输入->");
scanf("%d", &input);
if (input == 0)
{
printf("离开游戏\n");
break;
}
else if (input > 0 && input < 5)
{
printf("请输入数字数数字\n");
scanf("%d%d", &x, &y);
int ret = arr[input](x, y);
printf("%d\n", ret);
break;
}
else
{
printf("输入错误,请重新输入\n");
}
} while (input);
return 0;
}