C语言教程-在C语言中返回数组

什么是数组?
数组是一种数据结构,用于存储固定大小的同类型数据集合。简单来说,数组是一组具有相同类型的变量的集合。
例如,如果我们想声明'n'个变量n1、n2...n,如果我们单独创建所有这些变量,那么这将变得非常繁琐。在这种情况下,我们可以创建一个具有相同类型的变量数组。可以使用元素的索引来访问数组的每个元素。
让我们先看看如何将一维数组传递给函数。
将数组传递给函数
作为数组传递给函数
#include <stdio.h>
void getarray(int arr[]) {
printf("数组的元素为: ");
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}
}
int main() {
int arr[5] = {45, 67, 34, 78, 90};
getarray(arr);
return 0;
}
在上面的程序中,我们首先创建了数组arr[]
,然后将该数组传递给函数getarray()
。getarray()
函数打印出数组arr[]
的所有元素。
输出
数组的元素为: 45 67 34 78 90
作为指针传递数组给函数
现在,我们将看看如何将数组作为指针传递给函数。
#include <stdio.h>
void printarray(char *arr[]) {
printf("数组的元素为: ");
for (int i = 0; i < 5; i++) {
printf("%c ", arr[i]);
}
}
int main() {
char arr[5] = {'A', 'B', 'C', 'D', 'E'};
printarray(arr);
return 0;
}
在上面的代码中,我们将数组作为指针传递给函数。函数printarray()
打印出数组的元素。
输出
数组的元素为: A B C D E
请注意:从上面的例子中,我们可以观察到数组作为引用传递给函数,这意味着数组在函数外也存在。
如何从函数中返回数组
返回指向数组的指针
#include <stdio.h>
int *getarray() {
int arr[5];
printf("输入数组的元素: ");
for (int i = 0; i < 5; i++) {
scanf("%d", &arr[i]);
}
return arr;
}
int main() {
int *n;
n = getarray();
printf("\n数组的元素为: ");
for (int i = 0; i < 5; i++) {
printf("%d", n[i]);
}
return 0;
}
在上面的程序中,getarray()
函数返回变量arr
。它返回一个局部变量,但这是一个非法的内存位置,因为它在堆栈中的函数内部分配。由于程序控制流回到main()
函数,并且堆栈中的所有变量都被释放了,所以我们可以说该程序返回了一个已经被释放的内存位置,因此程序的输出是段错误。
输出
段错误
返回数组的正确方式有三种:
- 使用动态分配的数组
- 使用静态数组
- 使用结构体
将要返回的数组作为参数传递给函数,从函数中返回数组
#include <stdio.h>
int *getarray(int *a) {
printf("输入数组的元素: ");
for (int i = 0; i < 5; i++) {
scanf("%d", &a[i]);
}
return a;
}
int main() {
int *n;
int a[5];
n = getarray(a);
printf("\n数组的元素为: ");
for (int i = 0; i < 5; i++) {
printf("%d", n[i]);
}
return 0;
}
输出
输入数组的元素: 12 34 56 78 90
数组的元素为: 12 34 56 78 90
使用malloc()函数返回数组
#include <stdio.h>
#include <stdlib.h>
int *getarray() {
int size;
printf("输入数组的大小: ");
scanf("%d", &size);
int *p = malloc(sizeof(int) * size);
printf("\n输入数组的元素: ");
for (int i = 0; i < size; i++) {
scanf("%d", &p[i]);
}
return p;
}
int main() {
int *ptr;
ptr = getarray();
printf("输入的数组元素为: ");
for (int i = 0; ptr[i] != '\0'; i++) {
printf("%d ", ptr[i]);
}
return 0;
}
输出
输入数组的大小: 5
输入数组的元素: 12 34 56 78 90
输入的数组元素为: 12 34 56 78 90
使用静态变量
#include <stdio.h>
int *getarray() {
static int arr[7];
printf("输入数组的元素: ");
for (int i = 0; i < 7; i++) {
scanf("%d", &arr[i]);
}
return arr;
}
int main() {
int *ptr;
ptr = getarray();
printf("\n输入的数组元素为: ");
for (int i = 0; i < 7; i++) {
printf("%d ", ptr[i]);
}
}
在上面的代码中,我们将变量arr[]
作为静态变量在getarray()
函数中创建,它在整个程序中都可用。因此,函数getarray()
返回变量arr
的实际内存位置。
输出
输入数组的元素: 12 34 56 78 90 45 67
输入的数组元素为: 12 34 56 78 90 45 67
使用结构体
结构体是一种用户定义的数据类型,可以包含不同类型的项目集合。现在,我们将创建一个使用结构体返回数组的程序。
#include <stdio.h>
#include <stdlib.h>
struct array {
int arr[8];
};
struct array getarray() {
struct array y;
printf("输入数组的元素: ");
for (int i = 0; i < 8; i++) {
scanf("%d", &y.arr[i]);
}
return y;
}
int main() {
struct array x = getarray();
printf("输入的数组元素为: ");
for (int i = 0; x.arr[i] != '\0'; i++) {
printf("%d ", x.arr[i]);
}
return 0;
}
输出
输入数组的元素: 12 34 56 78 90 45 67 89
输入的数组元素为: 12 34 56 78 90 45 67 89