数组指针是一种指针 - 是指向数组的指针。
整形指针 - 指向整型的指针
字符指针 - 指向字符的指针
但是数组指针的使用需要注意,数组名是数组首元素的地址
1.整型指针 字符指针:
int main()
{
int a = 10;
int*pa = &a;
char ch = 'w';
char* pc = &ch;
return 0;
}
2.数组指针:
int main()
{
int arr[10] = {1,2,3,4,5};
&arr;//取出数组的地址
//arr;//arr - 数组名是数组首元素的地址 - arr[0]的地址
return 0;
}
那该怎样将数组的的地址放到指针中呢?
注:这里不能用 int* parr = &arr
原因:这里的parr是一个指针 ,指向的是 int,但 &arr又是一个数组的地址
数组的地址放到整型里不匹配
使用方法:
int (*parr)[10] = &arr
解释:1.(*parr)- parr首先和*结合说明parr是一个指针
2.(*parr)[10] - 说明指向的是一个数组,这个数组里有10个元素
3. int (*parr)[10] - 说明数组里的每一个元素都是整型
这里的parr就是一个数组指针 - 其中存放的就是数组的地址。
1.整型数组的指针
int main()
{
int* arr[5];
int* (*p2)[5] = &arr;
return 0;
}
注:这里的p2是指向【整型数组指针】的数组
2.函数指针数组
int main()
{
int (*p) (int, int); //函数指针
int(*p2[4]) (int, int); //函数指针的数组
int(*(*p3)[4]) (int, int) = &p2; //p3就是一个指向函数指针数组的指针
return 0;
}
解释:
1. p[2]4 是一个数组指针,指向的类型为函数指针
2. p[3]4也是一个数组指针,指向的类型为函数指针的数组
需知:(数组元素类型 - int 数组的类型是 - int [10])
int main()
{
int arr[10];
//数组元素类型 - int
//数组的类型是 - int [10]
return 0;
}
回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用的,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行相应。
解释:假设写了一个A函数,我们不是直接去调用这个A函数,而是把A函数的地址传给了B函数,所以B函数的形参部分一定有一个函数指针,在B函数中通过函数指针来访问A函数,我们就说这是回调函数。
回调函数的运用:(利用回调函数完成计算器)
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;
}
void menu()
{
printf("*******************************\n");
printf("** 1. Add 2. Sub **\n");
printf("** 3. Mul 4. Div **\n");
printf("** 0. exit **\n");
printf("*******************************\n");
}
int Calc(int(*pf)(int, int))
{
int x = 0;
int y = 0;
printf("请输入2个操作数>:");
scanf("%d %d", &x, &y);
return pf(x, y);
}
int main()
{
int inupt = 0;
do {
menu();
int ret = 0;
printf("请选择:>");
scanf("%d", &inupt);
switch (inupt)
{
case 1:
ret = Calc(Add);
printf("ret = %d\n", ret);
break;
case 2:
ret = Calc(Sub);
printf("ret = %d\n", ret);
break;
case 3:
ret = Calc(Mul);
printf("ret = %d\n", ret);
break;
case 4:
ret = Calc(Div);
printf("ret = %d\n", ret);
break;
case 0:
printf("退出程序\n");
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
} while (inupt);
return 0;
}
在这段代码中,写出了一个Calc函数,就是回调函数。*pf就是一个函数指针,分别指向四种算法。如果不用回调函数的话,switch语句中的每一项会非常冗杂且重复,回调函数更简便,更快捷地完成了这个计算器。
calc函数中的return pf(x , y),通过pf调用x y 来进行一个结果的计算