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);
}
运行结果: