8.11(4.19)指针进阶

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](23);
    printf("%d\n",ret);
    
    ret = pfArr[1](23)
    printf("%d\n",ret);
    return 0;
}
int Sub(int x,int y)
{
    return x - y;
}

函数指针数组

就是指向函数指针的数组,能判断就行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值