C 中的复杂声明

问题描述 投票:0回答:1

我试图理解 C 语言中的复杂声明,我编写了一个示例函数,它接受长度为 10 的整数数组作为参数,并返回一个指向长度为 10 的整数数组的指针 -

int (*x(int arr[10]))[10] {

    for (int i = 0; i < 10; i++) {
        arr[i] = 1;
    }

    return &arr[10];
}


int main() {

    int array[10];

    for(int i = 0; i < 10; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");

    x(array);

    for (int i = 0; i < 10; i++) {
        printf("%d", array[i]);
    }
}

但我不明白该放什么作为回报。

&arr[10]
给出错误
cannot convert 'int*' to 'int (*)[10]' in return
&arr
也给出了同样的错误。那么合适的返回语句应该是什么?

c
1个回答
1
投票

在您的 C 函数中

x
,您的目标是返回一个指向 10 个整数的数组的指针。但是,您尝试获取此返回值的方式不正确,导致您遇到错误。

让我们分解一下你的函数定义和必要的更正:

理解函数定义

声明

int (*x(int arr[10]))[10]
指定了一个函数
x

  • 采用一个参数:
    arr[10]
    ,一个包含 10 个整数的数组。
  • 返回指向 10 个整数的数组的指针。

分析退货声明

返回语句

return &arr[10];
不正确,因为
arr[10]
不是数组的有效元素——它超出了范围。此外,
&arr[10]
尝试获取此越界元素的地址,这会导致指向整数的指针 (
int*
),而不是指向 10 个整数的数组的指针 (
int (*)[10]
)。

正确的返回值

由于您想要返回一个指向 10 个整数的数组的指针,并且考虑到

arr
是一个包含 10 个整数的数组,因此正确返回的是
&arr
。该表达式返回整个数组的地址
arr

  • arr
    本身衰减为指向其第一个元素的指针 (
    int*
    )。
  • &arr
    给出整个数组的地址,从而匹配返回类型
    int (*)[10]

这是函数的更正版本:

int (*x(int arr[10]))[10] {
    for (int i = 0; i < 10; i++) {
        arr[i] = 1;
    }

    return &arr;  // Correct return statement
}

主要功能

您还需要更新 main 函数以正确处理从

x
返回的指针。

#include <stdio.h>

int (*x(int arr[10]))[10] {
    for (int i = 0; i < 10; i++) {
        arr[i] = 1;
    }

    return &arr;  // Return the address of the entire array
}

int main() {
    int array[10] = {0};  // Initialize array elements to 0

    for(int i = 0; i < 10; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");

    int (*returnedArray)[10] = x(array);  // Store the returned pointer

    for (int i = 0; i < 10; i++) {
        printf("%d ", (*returnedArray)[i]);  // Dereference and access the array
    }
    printf("\n");

    return 0;
}

在这个更正后的主函数中:

  • returnedArray
    接收指向
    x
    返回的数组的指针。
  • (*returnedArray)[i]
    访问返回数组的元素并打印它们,证明所有元素已通过函数
    x
    设置为 1。

如果这个解释可以帮助您理解这个概念,我很高兴知道! 😊

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.