欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c复杂函数指针

程序员文章站 2022-06-26 12:11:25
函数指针,函数的返回值是数组 上面的代码是声明一个函数指针,这个函数有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