【问题标题】:How do you use this: int (*x(int))[5]你如何使用它: int (*x(int))[5]
【发布时间】:2022-10-02 05:11:26
【问题描述】:

int (*x(int))[5] 说 x 是一个函数,它接受一个 int 参数,并返回一个指向 5 个元素的整数数组的指针。

我也可以使用typedef 来简化 x:

typedef int Array[5];
typedef Array *Array_ptr;
typedef Array_ptr Array_ptr_fn(int);

我的问题是,如何使用这种类型的 Array_ptr_fn?

// Define some_x to have type Array_ptr_fn,
 
Array_ptr_fn some_x;

// But then how do I use some_x since function cannot return array.

  • 除非你传递函数,否则直接声明你的函数,如Array_ptr someFunction(int); 即使你传递函数,你仍然可以使用这个声明作为函数参数。我认为您根本不需要第三个 typedef;它只是混淆了。
  • some_x 不尝试返回数组。它返回一个指针。

标签: c declaration typedef


【解决方案1】:

首先要注意的是x不是函数指针,而是一个实际的函数声明。它不是一个变量。一个指针x 的类型为int (*(*ptr_to_x)(int))[5]

第二个要注意的是x的返回值既不是int[5],也不是int[],也不是int*,而是int (*)[5]。也就是说,您需要编写 (*retval)[0] 才能获得实际的 int 值。

考虑到这一点,编写使用这些类型的概念证明并不难:

#include <stdio.h>

int arr[5] = { 11, 22, 33, 44, 55 };
int (*ptr)[5] = &arr;

int (*x(int ignored))[5]
{
    return ptr;
}

int main(void)
{
    int (*(*ptr_to_x)(int))[5] = &x;

    int (*i)[5] = ptr_to_x(123);
    printf("%d\n", (*i)[2]);

    return 0;
}

【讨论】:

    【解决方案2】:
    Array_ptr_fn some_x;
    

    您不能使用类型 Array_ptr_fn 来定义变量...但是您可以使用指向该类型的指针来存储将来要调用的函数引用(使用该接口),如下所示:

    int (*f1(int))[5];  /* implemented elsewhere */
    
    Array_ptr_fn *some_function = f1;
    
    int (*my_array)[5] = f1(27); 
     
    /* or equivalently */
    
    int (*my_second_array)[5] = some_function(27);
    

    【讨论】:

      猜你喜欢
      • 2012-12-14
      • 2014-07-05
      • 1970-01-01
      • 2012-04-02
      • 2013-01-26
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      相关资源
      最近更新 更多