zoukankan      html  css  js  c++  java
  • 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
    ",*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("
    ");
    
     
      int *(*(*fun)(int* a, int* b))[];
        
      //编译有警告但是可以通过
      fun = &arr;
      int *c = (*fun)(&a,&b);
      printf("c[0] = %d
    ",c[0]);
      printf("c[1] = %d
    ",c[1]);  
    
      //编译有警告但是可以通过
      fun = &arr1;
      int d = fun(&a,&b);
      printf("d = %d
    ",d);  
      
      //编译不过,因为参数不一样
      //fun = &arr2;
      // int e = fun(&a);
      //printf("e = %d
    ",e);
    
      //编译有警告但是可以通过
      fun = &arr3;
      int **f = (*fun)(&a,&b);
      printf("f[0] = %p
    ",f[0]); 
      printf("f[0] = %p
    ",f[1]);
      printf("*f[0] = %d
    ",*f[0]);
      printf("*f[1] = %d
    ",*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
    
  • 相关阅读:
    GridView自动排序
    asp.net GridView72般绝技
    asp.net 在线人数统计
    javascript 触发事件函数(网络收藏)
    javascript 函数大全一(网络收藏)
    asp.net按标示符分割字符串
    asp.net将DataView转换成DataTable
    APP Fundmentals
    TR69 TRxObjNode
    在桌面上添加 应用图标
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/9168391.html
Copyright © 2011-2022 走看看