int arr[5]整型数组
int *parr1[10]指针数组
int (*parr2)[10];数组指针,指向十个数组
int (parr3[10])[5] 十个元素的数组,数组指针类型
.-----parr3[10]每个元素都是一个数组指针
.-----( ) [5]
图示
…->int*5(每行指向五个数组)
…
…
…
10(一共代表有十行)
…
数组传参问题
(一维)二维数组传参
int arr[3][5];
test(arr)->一行的地址
void test(int *arr)整形指针
void test(int ** p)
{}二级指针传参三种引用方式
int **ptr= ;
test(ptr);
int *p2= ;
test(&ptr);
int *arr[10];
test(arr);
函数指针
就是指向函数的指针
类比于数组的打印
printf(“%p\n”,&arr);打印数组的地址
printf(“%p\n”,arr);打印首元素的地址
二者虽然结果地址一样,但代表的东西不同
但他如果void(add)打印出来的函数指针,所代表的东西是相同的
同样和数组指针类似
int arr[10]={0};
int(*p)[10]=&arr;
函数指针调用的时候
int add(int x,int y)
{
return x+y;
}
int (*pf)(int x,int y)=&add;
int sum=(*pf)(3,5);
printf(“%d\n”,sum);
也就是函数指针用法是
int(pt)(const char str ,double)=&test;
对函数指针的引申
( ( void ()() ) ) ;把0当做一个函数的地址
( ( void ()() ) )();把当做一个函数的地址把0直接转换成一个void (*)()的函数指针,然后去调用地址处的函数
对函数进行简化处理
typedf void(pf_t)(int );函数指针类型定义为pf_t
void ( * signal( int, void()(int) ) )(int);
->转化为pf_t signal(int ,pf_t);
//上述代码是一次函数声明
//声明的函数叫: signal//signal函数的第一个参数是int类型的
//signal函数的第二个参数是一个函数指针类型,该函数指针指向的函数参数是int,返回类型是void
//signal函数的返回类型也是一个函数指针类型,该函数指针指向的函数参数是int,返回类型是void
函数指针数组
计算器不用switch和case函数以避免更多函数调用导致的主函数冗余
int main()
{
//函数指针数组
//可以存放多个[参数相同、返回类型相同] 的函数的地址
int (* pfArr[2])(int, int) = {Add,Sub};
int ret = pfArr[0](2,3);
printf("%d\n",ret);
ret = pfArr[1](2,3)
printf("%d\n",ret);
return 0;
}
int Sub(int x,int y)
{
return x - y;
}
函数指针数组
就是指向函数指针的数组,能判断就行