在本教程中,您将学到关于名为数组的数据结构的一切。通过简单的示例,您将了解如何声明、初始化和访问数组中的变量。
C 语言编程中的数组是一种特殊的数据结构,它按顺序存储一组有限的、相同数据类型的元素。更清晰地说,我们可以将数组定义为一个存储多个相同数据类型元素的变量。

数组也称为结构化数据类型,属于派生数据类型的范畴,因为它能够存储基本数据类型(如 int、char、float、double 等)和派生数据类型(如指针、结构体等)。上图显示了一个包含 6 个元素的数组。
定义数组的一般原型是——
data_type array_name[size of array in numbers];
请看下面的例子
int age[];
float sal[6];
这里,数组 age[] 的数据类型是 int ,并且没有指定数组的大小。
在第二种情况下,数组 sal[6] 在内存中创建了六个相邻的单元,分别是 sal[0]、sal[1]、sal[2]、sal[3]、sal[4] 和 sal[5],用于存储 float 类型的值。
数组的分配从“零”开始,因此该系列的最后一个变量将存储在 a[size -1] 处。在我们的例子中,数组的第一个元素将分配在 sal[0],最后一个元素将分配在 sal[5]。
注意:数组的大小和类型一旦声明就是永久的。
数组声明后的下一步是数组初始化,这可以在编译时或运行时完成。如果数组未初始化,它将在内存中包含称为垃圾值的任何随机值。
初始化数组最方便的做法是在声明语句中直接定义每个元素的值。数组初始化的语法是
data_type array_name[size ] = {value_1st_element,value_2nd_element,3rd.....};
例如,
int age[] = {25,27,29,30,35,37}; # integer array initialization
float sal[6] = {2500,2700,2900,3000,3500,3700}; #float array initialization
数组的运行时初始化意味着用户可以在程序执行期间输入值。这可以借助 C 语言中的内置函数 scanf 来实现。这种方法在需要进行大规模数组初始化的情况下也很有用。
#include<stdio.h>
main() {
int i;
int sal[5];
for (i = 0; i < 5; i++) {
printf(" \n Enter the amount of salary -->[%d]:", i);
scanf("%d", & sal[i]);
}
}

如果我们没有定义任何元素的值,编译器会将其视为 null(零)。
例如 int i[5]={12,52};
这是一个有效的语句。但它意味着
i[0]=12
i[2]=0
i[1]=52
i[3]=0
i[4]=0
要访问数组中的元素,我们可以使用它们的索引,因为我们使用相同的策略进行初始化。
借助 scanf 函数和 for 循环,我们可以向数组中输入值。同样,我们利用 printf 函数和循环来打印通过索引从数组中访问的值。
#include
int main() {
int n;
int arr[100];
int i;
printf("Enter the number of elements in array :\n");
scanf("%d", & n);
printf("\nEnter the elements in array :\n");
for (i = 0; i < n; i++) {
scanf("%d", & arr[i]);
}
printf("\nThe array is :\n");
for (i = 0; i < n; i++) {
printf("%d\t", arr[i]);
}
printf("\n\nThe array in reversed order is:\n");
for (i = n - 1; i >= 0; i--) {
printf("%d\t", arr[i]);
}
return 0;
}
输出
Enter the number of elements in array : 6 Enter the elements in the array : 10 20 30 40 50 60 The array is : 10 20 30 40 50 60 The array in reversed order is: 60 50 40 30 20 10
解释:
在上面的程序中,声明了一个整数数据类型的数组 arr[100]。这个声明通知内存为 100 个元素分配空间。借助 scanf 函数,数组大小被初始化为变量 n。同样,数组的元素也被初始化。首先,我们使用 printf 函数和 for 循环按原样显示数组。之后,打印反转后的数组。唯一的区别在于 for 循环的声明。
include < stdio.h >
int main() {
int n;
int arr[100];
int i, j, temp;
printf("Enter the number of elements in array :\n");
scanf("%d", & n);
printf("\nEnter the elements in array :\n");
for (i = 0; i < n; i++) {
scanf("%d", & arr[i]);
}
printf("\nThe unsorted array is :\n");
for (i = 0; i < n; i++) {
printf("%d\t", arr[i]);
}
for (i = 0; i < n; ++i) {
for (j = i + 1; j < n; ++j) {
if (arr[i] > arr[j]) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
printf("\nThe sorted array is : \n");
for (i = 0; i < n; ++i)
printf("%d\t", arr[i]);
}
输出
Enter the number of elements in array : 8 Enter the elements in array : 4 44 35 19 76 28 16 46 The unsorted array is : 4 44 35 19 76 28 16 46 The sorted array is : 4 16 19 28 35 44 46 76
上面的程序演示了对数组中元素进行排序。排序是通过将第一个元素与第二个元素进行比较来完成的。如果条件满足,则使用临时变量 temp 进行元素交换,这个过程会重复进行,直到所有元素都按升序完全排序。要练习更多关于数组的程序,请参考我们的示例程序。
在 C 语言编程中,二维数组由行和列组成,就像一个矩阵。因此,一个二维数组可以被看作是数组的数组。
声明语句有两个连续的索引,一个表示行数,另一个表示列数,如下所示
data_type array_name [row] [column];
int table [2] [3];
这里,table 是一个二维数组,它在 2 行 3 列中存储 6 个整数值。在声明二维数组时,行大小和列大小都必须用方括号括起来。每个元素的分配将如下所示

有两种方法可以初始化二维数组。
二维数组的编译时初始化
如前所述,初始化可以在声明期间完成,其形式为
data_type array_name [row] [column]= {value_1st_element,value_2nd_element,3rd.....};
例如,
int table [2] [3]={
{10,20,30};
{40,50,60};
}
同样的内容可以如下定义在一行中,这样更方便、更容易。
int table[2][3]={10,20,30,40,50,60};
C 语言提供了一种声明数组的方法,即第一个索引(行)可以留空,但第二个索引(列)是必须指定的。下面的例子显示,在二维数组 table 中,行大小留空,而列大小已提供。
int table[][3]={10,20,30,40,50,60};
编译器不会报任何错误,因为这个语句是有效的,意味着可以在 C 语言中初始化任意数量的行。但是如果未指定列大小,编译器将会报错。
二维数组在初始化后可以最好地可视化如下。

二维数组的运行时初始化
我们可以借助 scanf 函数来完成二维数组的运行时初始化。通过检查下面的程序可以看出这一点。
#include<stdio.h>
void main()
{
int table[3][4];
int i, j;
printf("Enter array elements :");
for(i = 0; i < 3;i++)
{
for(j = 0; j < 4; j++)
{
scanf("%d", &table[i][j]);
}
}
}
从上面的代码片段可以很清楚地看出,要向二维数组中输入值,我们需要嵌套的 for 循环和 scanf 函数。
// Print an 3 x 3 matrix
#include <stdio.h>
int main()
{
int i, j, r, c;
int M[5][5];
printf("Enter number of rows : ");
scanf("%d", &r);
printf("Enter number of columns :");
scanf("%d", &c);
printf("\n");
/* Input data to matrix */
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
printf("Data in M[%d][%d] = ", i, j);
scanf("%d", &M[i][j]);
}
printf("\n");
}
/* Display the matrix */
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
printf("%d\t", M[i][j]);
}
printf("\n");
}
return 0;
}
输出
Enter number of rows : 3 Enter number of columns : 3 Data in M[0][0] = 1 Data in M[0][1] = 2 Data in M[0][2] = 3 Data in M[1][0] = 4 Data in M[1][1] = 5 Data in M[1][2] = 6 Data in M[2][0] = 7 Data in M[2][1] = 8 Data in M[2][2] = 9 1 2 3 4 5 6 7 8 9
这个程序让你对二维数组有一个清晰的了解。数组 M[5][5] 包含 25 个元素,有 5 行 5 列。由于程序是为了显示一个 3x3 的矩阵,所以行数和列数被指定为 3。接下来,为每个位置分配元素,最后,使用 printf 函数和嵌套 for 循环来显示矩阵。
在 C 语言编程中,我们可以处理超过二维的数组。一个三维数组的语法是
data_type array_name [row][column][pages]= {value_1st_element,value_2nd_element,3rd.....};
例如,
int arr[10][10][10];
这个数组将在编译器的内存中分配 10X10X10=1000 个元素。
三维数组可以看作如下所示。

三维数组的初始化与二维数组非常相似。观察下面的例子
int test[3][3][3] = {
{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}},
{{10, 11, 12}, {13, 14, 15}, {16, 17, 18}},
{{19, 20, 21}, {22, 23, 24}, {25, 26, 27}}
};
这可以可视化为如下的展开形式。

在 C 语言中,所有类型的数组都可以通过函数传递以执行特定任务。让我们先看看如何传递数组元素,然后再看如何将数组传递给函数。
将单个数组元素传递给函数的方式与我们在函数内部传递值的方式类似。
这是一个将单个元素传递给函数的简单示例
#include <stdio.h>
void display_arr(int a);
int main()
{
int m_arr[] = { 20, 30, 40 };
display_arr(m_arr[1]);
return 0;
}
void display_arr(int a)
{
printf("%d", a);
}
输出
30
在这段代码片段中,只有位置 1 的数组元素被传递给了函数 display_arr。
在传递数组时,需要始终记住的关键点是,只需将数组的名称作为参数传递给函数,不需要方括号。
将数组传递给函数的语法如下
functionname(array_name); //passing array
要接收一个数组作为参数,我们必须用以下两种方式之一来声明函数
#include <stdio.h>
float Average(int marks[]);
int main() {
int result, marks[] = {48, 38, 45, 46, 40, 36};
float avg;
// age array is passed to calculateSum()
avg = Average(marks);
printf("Average = %f", avg);
return 0;
}
float Average(int marks[]) {
float sum = 0.0;
for (int i = 0; i < 6; ++i) {
sum += marks[i];
}
return sum/6;
}
输出
Average = 42.166668
在这个例子中,我们通过只提及数组名 (marks) 而不使用方括号,将一个一维数组 (marks[]) 传递给了函数。然而,在函数定义中,我们提到了这个数组名以及方括号,这告诉编译器传递的参数是一个一维数组。
同样,我们可以将多维数组传递给函数。
在 C 语言中,不可能直接通过函数返回整个数组。解决方案是返回一个指向数组的指针。但我们必须将数据类型声明为静态的(static)。否则,编译器会将其视为局部变量,并限制程序使用数组的地址值。其结构将如下所示
return _type * Function_name() {
//some statements;
return array_name; //array_name as in function definition
}
我们将在下一个教程中详细学习指针。