1 数组的初始化
数组的初始化是指,在创建数组的同时给数组赋一些合理的值。
数组初始化的方式有很多种,我们可以按照有没有完全初始化创建的数组空间将其分为以下两类:
-
完全初始化数组:所有元素在创建时都被明确赋值。
-
部分初始化数组: 只有部分元素被赋值,其余元素会被自动初始化为默认值(例如,整型数组的元素默认为0)。
1.1 完全初始化数组
代码如下:
int arr3[5] = { 1, 2, 3, 4, 5 };
char arr4[3] = { 'a',98, 'c' };//‘’用来定义单个字符
1.2 部分初始化数组
代码如下:
//数组的不完全输出化,[]里面的空间可以不定义, 即不指定数组大小;
//未定义的范围会自动置为默认值0
char arr1[3] = { 'a','b','c' };
char arr2[4] = "abc"; //字符串数组末尾会自动添加“\0”
char arr5[10] = { 'a','b','c' };
char arr6[10] = "abc"; //字符串数组末尾会自动添加“\0”
1.3 字符串数组的内存分配
在部分初始化数组时,在未定义的范围,系统会置为默认值“ \0 ”。比如
图中arr5,arr6 未定的部分便被系统默认置为了“\0”。
同时,字符串数组会自动在末尾添加“\0”,所以定义空间范围时要记得加上“\0”。比如
图中arr2便比arr1多一个“\0”,但两者其实是等效的,打印的结果一样。
2 数组的传参
当数组作为函数的形参时,实际上传递的是一个指针(即这个数组数组名的首元素地址),而不是整个数组。换句话说,数组的形参声明中虽然可以写成数组的形式,但本质上是指针类型。
2.1 传参的形式
数组的传参有以下几种形式:
void test1(int arr[], int size); // 使用数组表示
void test2(int arr[3], int size); // 可以带有长度(但会忽略)
void test3(int* arr, int size); // 使用指针表示
在上述三种声明方式中,因为数组作为函数的形参时实际上传递的是一个指针,所以形参arr
都是指向int
类型的指针。
2.2 数组传参的方式
在C语言中,将一维数组作为参数传递给函数有以下几种不同的方法。
2.2.1 通过指针传递数组
最常见的方式是通过指针来传递数组。由于数组名本身就代表数组的首地址(即指向第一个元素的指针),因此可以直接将数组名作为参数传递给函数。
void printArray(int* arr, int size)
{
for (int i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[5] = { 1, 2, 3, 4, 5 };
printArray(arr, 5);
return 0;
}
2.2.2使用数组指针来传递数组
另一个方法是使用数组指针来传递数组。这种方法在函数参数中明确指定了数组的大小。
//这种方式的代码,数组只能在已知数组大小时使用
void printArray(int arr[5])
{
for (int i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[5] = { 1, 2, 3, 4, 5 };
printArray(arr);
return 0;
}
2.2.3使用数组指针来传递数组
实际上,在进行数组传参时,数组表示和指针表示是等价的。当我们在函数参数中使用数组时,编译器会自动将其转换为指向数组首元素的指针。因此,下面的代码与通过指针传递数组的例子等效:
void printArray(int arr[], int size)
{
for (int i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[5] = { 1, 2, 3, 4, 5 };
printArray(arr, 5);
return 0;
}
3 数组的传参的常见错误
数组在传参时因为传入的是数组首元素的地址,所以如果此时在以数组作为形参的函数内部获取该数组的长度,得到的长度会是4,是数组首元素的地址的长度。比如:
#include <stdio.h>
void bubble_sort(int arr[])
{
int sz = sizeof(arr);
printf("sizeof(arr) = %d\n", sz);
}
int main()
{
int arr[] = { 3,1,7,5,8,9,0,2,4,6 };
bubble_sort(arr);
return 0;
}
运行代码可得长度确实为4:
此时 ,想要解决这个问题,便需要在该函数外面求得数组得长度。此时得到的长度便是整个数组的长度。比如:
#include <stdio.h>
void bubble_sort(int arr[])
{
int sz = sizeof(arr);
printf("sizeof(arr) = %d\n", sz);
}
int main()
{
int arr[] = { 3,1,7,5,8,9,0,2,4,6 };
int sz = sizeof(arr);
printf("sizeof(arr) = %d\n", sz);
bubble_sort(arr);
return 0;
}
运行代码如下:
4 补充
sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组。
&数组名,取出的是数组的地址。&数组名,数组名表示整个数组。
除此1,2这两种情况之外,所有的数组名都表示数组首元素的地址。