c复杂函数指针

函数指针,函数的返回值是数组

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

猜你喜欢

转载自www.cnblogs.com/xiaoshiwang/p/9168391.html