1. 数组是什么
在C语言中,数组是一种常见的数据类型。它是一组同种类型数据的集合,这些数据被存储在连续的内存位置上,并且可以按照索引访问。数组的索引从0开始,最大索引为n-1,n为数组的大小。 在C语言中,定义数组的语法如下:数据类型 数组名[数组大小]
。
int arr[5];
float b[7];
char c[10];
上面的三个数组分别定义了一个包含5、7和10个元素的整型数组、浮点型数组和字符数组。数组的大小必须是一个正数,而且只能在数组定义的时候指定,之后不能进行改变。
2. 如何初始化数组
初始化数组是指在定义数组的时候赋予数组一些初始值。在C语言中,可以使用以下方式来初始化数组:
2.1. 直接初始化
可以在定义数组的同时给数组的元素指定初值,用花括号“{}”括起来,每个元素之间用逗号隔开。例如:
int arr[5] = {1, 2, 3, 4, 5};
float b[7] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7};
char c[4] = {'a', 'b', 'c', '\0'};
多余的元素为0或者被忽略,需要注意的是,如果定义数组时没有指定初值,则数组中的元素值是未知的。
2.2. 部分初始化
可以只给数组的部分元素初始化,未初始化的元素将自动赋值为0。例如:
int arr[5] = {1, 2};
float b[7] = {0.1, 0.2, 0.3};
上述例子中,arr的第1个元素为1,第2个元素为2,其余元素为0;b的前3个元素为0.1、0.2、0.3,其余元素为0。
2.3. 不进行初始化
如果定义数组时没有指定初值,则数组中的元素值是未知的。例如:
int arr[5];
float b[7];
在上面的代码中,arr数组和b数组中的元素值都是未知的。
3. 数组的使用
3.1. 访问数组元素
可以使用数组的下标来访问数组元素。数组的下标必须是一个整数,可以是常量、变量或表达式。例如:
int arr[5] = {1, 2, 3, 4, 5};
printf("%d\n", arr[0]); // 输出1
printf("%d\n", arr[2]); // 输出3
上面的代码中,使用下标0和2分别访问了arr数组中的第一个和第三个元素。
3.2. 数组作函数参数
数组也可以作为函数的参数进行传递。在函数调用的时候,数组名会被自动转换为指向数组首元素的指针。例如:
void print_array(int arr[], int len)
{
int i;
for (i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[5] = {1, 2, 3, 4, 5};
print_array(arr, 5);
return 0;
}
上面的代码中,print_array函数接受一个整型数组和一个整型参数作为参数。在main函数中,将一个长度为5的数组作为参数传递给print_array函数进行打印。
3.3. 数组的遍历
数组的遍历是指依次访问数组中的每一个元素。可以使用循环结构来遍历数组,常见的有for循环和while循环。例如:
int arr[5] = {1, 2, 3, 4, 5};
int i;
for (i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
上面的代码中,使用for循环遍历了arr数组中的所有元素并打印出来。
4. 数组的注意事项
4.1. 数组越界
数组越界是指访问的数组元素超过了数组的范围。数组越界可能会导致程序崩溃或产生不可预期的结果。例如:
int arr[5] = {1, 2, 3, 4, 5};
printf("%d\n", arr[5]); // 这里越界了,会导致程序崩溃
上面的代码中,由于arr数组只有5个元素,而程序试图访问索引为5的元素,导致程序崩溃。
4.2. 数组作为函数参数的限制
当数组作为函数参数进行传递的时候,数组的大小必须在函数的形参中指定。例如:
void print_array(int arr[], int len)
{
// ...
}
在上面的代码中,print_array函数定义了一个整型数组和一个整型参数作为形参,其中第二个参数指定了数组的大小。
4.3. 数组名的使用
在C语言中,数组名既可以表示数组本身,也可以表示数组的首元素的地址。例如:
int arr[5] = {1, 2, 3, 4, 5};
printf("%d\n", arr); // 数组名arr表示数组的首元素的地址
printf("%d\n", &arr[0]); // &arr[0]也表示数组的首元素的地址,与arr等价
上面的代码中,arr和&arr[0]都表示arr数组的首元素的地址。
4.4. 多维数组
在C语言中,可以定义多维数组,即数组的元素本身可以是数组。例如:
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
printf("%d\n", arr[0][0]); // 输出1
printf("%d\n", arr[1][2]); // 输出6
上面的代码中,arr是一个2行3列的数组,每个元素是一个整型数。可以使用arr[i][j]的方式来访问数组元素。
4.5. 指针和数组
在C语言中,数组名可以隐式地转换为指向数组首元素的指针。例如:
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr;
printf("%d\n", *p); // 输出1
printf("%d\n", *(p+2)); // 输出3
上面的代码中,将arr数组的首地址赋值给指针p,在使用指针p访问arr数组中的元素时,可以使用*p或者*(p+i)的形式进行访问。
5. 总结
数组是C语言中常见的数据类型,它可以表示一组同种类型数据的集合,可以使用下标来访问数组中的元素。C语言中可以使用直接初始化、部分初始化和不进行初始化的方式来初始化数组。数组可以通过循环遍历来访问每一个元素。当数组作为函数参数进行传递的时候,数组的大小必须在函数的形参中指定。数组名可以隐式地转换为指向数组首元素的指针。