指针数组
首先声明,指针数组是数组,比如 int *arr1[10](是数组);char*arr2[4](是数组) char**arr3[5](是数组)。
数组指针
是指针,指针都有类型,那么,int*print是能指向整型数据的指针,[]比*的优先级高,但是int (*p)[10]确是数组指针,这个指针有能力指向一个数组。接下来来看一段代码:
int arr[10]={0};
arr;//数组首元素的地址
&arr;//数组地址
Printf(“%p\n”,arr);首地址
Printf(“%p\n”,arr+1);第二个元素地址;
Printf(“%p\n”,&arr+1);//下一个数组个的首地址;
Printf(“%p\n”,&arr[0]+1);//第二个元素的地址;
数组指针存放数组地址最合适;
对于二维数组的传参,由于二维数组在内存中是连续存放地址的,其实它的本质是指向一位数组的指针,所以必须指定这个所指向的一维数组的长度。
函数指针
在内存中任何东西都有地址,函数也不例外,那么值得思考的问题就是,函数的地址应该怎样保存,,即就是通过函数指针存放,比如 void (*pfun1)();
函数指针数组
Int (*parr1[10])();
函数指针数组的用途就是:转移表。(计算器)代码如下:
#include<stdio.h>
#include<windows.h>
#pragma warning(disable:4996)
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 mydiv(int a, int b)
{
return a / b;
}
int main()
{
int x = 0;
int y = 0;
int input = 1;
int ret = 0;
int(*p[5])(int x, int y) = { 0, add, sub, mul, mydiv };//转移表
while (input)
{
printf("*****************************\n");
printf(" 1.add 2.sub \n");
printf(" 3.mul 4.div \n");
printf("*****************************\n");
printf("请选择:");
scanf("%d", &input);
if ((input<5&& input>0))
{
printf("输入操作数");
scanf("%d %d", &x,&y);
ret = (*p[input])(x, y);
}
else
printf("输入有误");
printf("ret=%d\n", ret);
}
return 0;
}
函数指针数组指针
看代码
void test(const char*str)
{
printf("%s\n",str); }
int main()
{
void(*pfun)(const char*) = test;//函数指针pfun
void(*pfunarr[5])(const char* str);//函数指针数组pfunarr
pfunarr[0] = test;
void(*(*pfunarr)[10])(const char*);//指向函数指针数组pfunarr的指针ppfunarr;
return 0;}
可以无限制的加*,当然在实际编码的时候不存在这么复杂的操作,因为代码是给人看的。哈哈。