我试图理解 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 函数中
x
,您的目标是返回一个指向 10 个整数的数组的指针。但是,您尝试获取此返回值的方式不正确,导致您遇到错误。
让我们分解一下你的函数定义和必要的更正:
声明
int (*x(int arr[10]))[10]
指定了一个函数 x
:
arr[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。如果这个解释可以帮助您理解这个概念,我很高兴知道! 😊