0

我真的对这个程序不知所措。我希望它返回一个由 5 个元素组成的整数数组的地址。但它不会工作。如何让 C 函数返回数组的地址而不是它的地址第一个元素(基地址)?我知道两者在数字上相同,但它们的类型不同,这就是我问的原因。

更准确地说,如何声明此类函数的原型?我了解如何声明原型的参数部分(使用抽象声明符),但如果我们要返回地址,我不知道如何声明返回类型数组或函数。我只知道如果我们在声明中的函数名之前放置一个“*”,这意味着该函数返回一个指向相应主要数据类型的指针,如 int、char 或 float。

    #include<stdio.h>

    int (*)[5]fun(int (*)[5]);

    int main(void)
    {

    int arr[5];

    printf("%u",fun(&arr));

    }

    int (*)[5]fun(int (*arr_add)[5])
    {
    return arr_add;
    }

你好!! DANIEL FISCHER感谢您的回答。您的回答准确而简洁。但我选择了 H2CO3 的回答,因为那个聪明的匈牙利孩子不厌其烦地通过聊天向我详细解释。很难选择最好的当这么多聪明的人回答时回答。谢谢大家!

4

3 回答 3

5

也许解释它是如何工作的有一些用处。

C 的声明语法背后的思想是“声明模仿使用”。所以你要

  • 一个函数

    fun( )
    
  • 获取一个指向五个数组的指针int

    fun(int (*arr)[5])  // or without argument name fun(int(*)[5])
    
  • 并返回一个指针

    (*fun(int (*arr)[5]))
    
  • 到五个数组

    (*fun(int (*arr)[5]))[5]
    
  • int

    int (*fun(int (*arr)[5]))[5];
    

或者,你也可以从结果中去,那应该是一个指向数组的指针五int

int (*result)[5];

result用调用 ( result = fun(arr))代替

int (*fur(arr))[5];

然后添加参数的类型/用它的类型替换参数:

int (*fun(int(*)[5]))[5];
于 2013-04-13T09:11:03.570 回答
2

给你:

int (*fun(int (*arr)[5]))[5]
{
    return arr;
}

如果你想返回第一个元素的地址(而不是数组本身的地址),那是另一种类型:

int *fun(int (*arr)[5])
{
    return &(*arr)[0];
}
于 2013-04-13T08:25:43.100 回答
1

这是错误的:

printf("%u",fun(&arr));

真的应该是:

printf("%p", (void*)fun(&arr));

至于数组的地址,它将与其第一个元素的地址相同。

现在,声明和定义应该看起来像:

int (*fun(int(*)[5]))[5];

固定代码:

#include<stdio.h>

int (*fun(int (*)[5]))[5];

int main(void)
{
    int arr[5];

    printf("%p\n", (void*)fun(&arr));
}

int (*fun(int (*arr_add)[5]))[5]
{
    return arr_add;
}

ideone

于 2013-04-13T08:22:00.863 回答