int *(**(**ppfunarrpp)(int))[10]的定义和应用

ppfunarrpp是函数指针的指针,函数的参数是int,函数的返回值是指针的指针,这个指针指向一个数组,数组的每个元素是一个指针。

思路

1.先定义这个函数指针的指针指向的函数

 int *(**ppfunarr(int))[10];

2.定义一个函数指针指向这个函数

int *(**(*ppfunarrp)(int))[10] = &ppfunarr;

3.ppfunarrpp是函数指针的指针,ppfunarrp是函数指针,ppfunarrpp指向ppfunarrp

  int *(**(**ppfunarrpp)(int))[10] = &ppfunarrp;

4.函数返回数组指针的指针,这个数组每个元素都是int型指针

int *(*parr)[10];其实函数的返回值应该是int *(**parr)[10],解引用一次函数就可以了。

5.调用函数

parr = *(*ppfunarrpp)(6);// *(*****ppfunarrpp)(6);

1.第一个*是解对这个函数引用,因为函数的返回值是int *(**parr)[arr]

2.第二个*是函数指针的指针,所以也要解引用获取到函数的地址。

※注意:调用函数fun的的方式可以是*fun、fun、 &fun,甚至可以是********fun

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *(**ppfunarr(int))[10];
    int *(**(*ppfunarrp)(int))[10] = &ppfunarr;
    int *(**(**ppfunarrpp)(int))[10] = &ppfunarrp;
    int *(*parr)[10];
    int i, j;
    
    parr = *(*ppfunarrpp)(6); // *(*****ppfunarrpp)(6);

    for(i = 0; i < 10; i++){
        for(j = 0; j < 6 ; j++)
            printf("%d\t", *(*(*parr + i)+j)); //*((*parr)[i] + j)
        printf("\n");
    }
    
    return 0;
}

int *(**ppfunarr(int num))[10]
{
    static int *arr[10] = {NULL};
    static int *(*parr)[10] = &arr;
    int i, j;

    for(i = 0; i < 10; i++){
        arr[i] = calloc(num, sizeof(int));

        for(j = 0; j < num ; j++)
            *(arr[i]+j) = i + j;
    }

    printf("num is %d\n", num);
    return &parr;
}
6.举个例子说明上面的注意
#include <stdio.h>
#include <stdlib.h>

void print_hello_world()
{
    puts("hello world!");
}

int main(void)
{
    (&print_hello_world)();
    int (*pfun)() = &print_hello_world;
    (********print_hello_world)();
    exit(EXIT_SUCCESS);
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值