什么是数组?

数组是一种数据结构,用于存储固定大小的同类型数据集合。简单来说,数组是一组具有相同类型的变量的集合。

例如,如果我们想声明'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

标签: c语言, c语言教程, c语言技术, c语言学习, c语言学习教程, c语言下载, c语言开发, c语言入门教程, c语言进阶教程, c语言高级教程, c语言面试题, c语言笔试题, c语言编程思想