c复杂函数指针
程序员文章站
2022-03-14 10:01:43
函数指针,函数的返回值是数组 上面的代码是声明一个函数指针,这个函数有2个int指针参数,返回值是指针,指向的是数组,数组里放的是int指针。但是,实际用代码验证一下,并不是想象的那样。 结论:只要参数一样,返回值不管是int指针数组,int数组,还是int,编译都会通过,执行没有问题。但是编译时有 ......
函数指针,函数的返回值是数组
int *(*(*fun)(int* a, int* b))[];
上面的代码是声明一个函数指针,这个函数有2个int指针参数,返回值是指针,指向的是数组,数组里放的是int指针。但是,实际用代码验证一下,并不是想象的那样。
结论:只要参数一样,返回值不管是int指针数组,int数组,还是int,编译都会通过,执行没有问题。但是编译时有警告:【initialization makes integer from pointer without a cast [-Wint-conversion]】
#include <stdio.h> #include <stdlib.h> //这个函数有2个int指针参数,返回值是指针数组,数组里放的是int指针,按理说应该和上面声明的函数指针是匹配的,其实地下的arr和arr1也可以和它匹配。 int **arr3(int* a, int* b){ //因为要返回的是指针数组,所以用二级指针 int **p = (int**)malloc(sizeof(int*) * 2); p[0] = a; p[1] = b; return p; } //这个函数有2个int指针参数,返回值是数组,数组里面放的是int,按理说应该和上面声明的函数指针是不匹配的,但是可以匹配 int *arr(int* a, int* b){ printf("%d, %d\n",*a,*b); int *p = (int*)malloc(sizeof(int) * 2); p[0] = *a; p[1] = *b; return p; } //这个函数有2个int指针参数,返回值是int,按理说应该和上面声明的函数指针是不匹配的,但是可以匹配 int arr1(int* a,int* b){ return 100; } //这个函数有1个int指针参数,返回值是int,按理说应该和上面声明的函数指针是不匹配的,确实不匹配,编译不过 int arr2(int* a){ return 200; } //返回的是数组指针,指向的数组是int[2](和最上面声明的函数指针没有关系) int (*getAr())[2]{ int (*p)[2] = (int(*)[2])calloc(2, sizeof(int)); for(int i = 0; i < 2; ++i){ (*p)[i] = i; } return p; } int main(){ int a = 10; int b = 20; //接受 getAr()的例子 int (*p)[2] = getAr(); for(int i = 0; i < 2; ++i){ printf("%d ", (*p)[i]); } printf("\n"); int *(*(*fun)(int* a, int* b))[]; //编译有警告但是可以通过 fun = &arr; int *c = (*fun)(&a,&b); printf("c[0] = %d\n",c[0]); printf("c[1] = %d\n",c[1]); //编译有警告但是可以通过 fun = &arr1; int d = fun(&a,&b); printf("d = %d\n",d); //编译不过,因为参数不一样 //fun = &arr2; // int e = fun(&a); //printf("e = %d\n",e); //编译有警告但是可以通过 fun = &arr3; int **f = (*fun)(&a,&b); printf("f[0] = %p\n",f[0]); printf("f[0] = %p\n",f[1]); printf("*f[0] = %d\n",*f[0]); printf("*f[1] = %d\n",*f[1]); }
执行结果:
0 1 10, 20 c[0] = 10 c[1] = 20 d = 100 f[0] = 0x7ffef9c9c4f8 f[0] = 0x7ffef9c9c4fc *f[0] = 10 *f[1] = 20
上一篇: 课时91.CSS元素显示模式(掌握)