文章目录
-
-
- 一、一维数组的创建
-
-
- [C99标准前,[ ]中必须要给常量或常量表达式](#C99标准前,[ ]中必须要给常量或常量表达式)
- C99标准后,支持了变长数组,但是这种情况下只允许定义,不允许初始化
-
- 二、一维数组的初始化
- 三、二维数组的创建和初始化
- 四、数组名做为函数参数
-
一、一维数组的创建
C99标准前,[ ]中必须要给常量或常量表达式
C99标准后,支持了变长数组,但是这种情况下只允许定义,不允许初始化
c
// 1.C99标准前,[]中必须要给常量或常量表达式
int arr[10];
char arr1[5 + 3];
// 2.C99标准后,支持了变长数组,但是这种情况下只允许定义,不允许初始化
int n = 10;
int arr2[n];
return 0;
二、一维数组的初始化
注意:字符数组的两种初始化方式,注意做辨别
c
// 1.部分初始化
int arr[5] = {1, 2, 3}; // 数组大小为5,数组中初始化为1 2 3 0 0
// 2.完全初始化
int arr1[5 + 3] = {1, 2, 3, 4, 5, 6, 7, 8}; // 数组大小为8
// 3.不指定数组大小,根据元素个数进行初始化
int arr2[] = {1, 2, 3, 4, 5}; // 数组大小为5
// 4.字符数组的两种初始化方式,注意做辨别
char arr3[] = {'a', 'b', 'c'}; // 数组大小为3
char arr4[] = "abc"; // 数组大小为4,含\0
// 注意,这两种初始化方式虽然得到的结果相同但是初始化的过程是不同的,注意区别!
char arr5[5] = {'a', 'b', 'c'}; // 数组大小为5 初始化数据为 a,b,c 未初始化部分编译器补2个\0
char arr6[5] = "abc"; // 数组大小为5 初始化数据为 a,b,c,\0 未初始化部分编译器补1个\0
return 0;
三、二维数组的创建和初始化
注意:二维数组行数可省略但列数不可以省略
c
// 1.完全初始化
int arr[3][2] = {1, 2, 3, 4, 5, 6};
// 2.不完全初始化
int arr1[3][2] = {1, 2, 3, 4};
// 3.分组不完全初始化
int arr2[3][2] = {{1, 2}, {3}, {4, 5}};
// 4.注意:二维数组行数可省略但列数不可以省略
int arr3[][2] = {1, 2, 3}; // 自动生成arr[0]和arr[1]
return 0;
四、数组名做为函数参数
数组名做为形参传递时实际上传的是首元素的地址,所以若想求元素个数不能在自定义的函数中计算而是要用参数传递。
以冒泡排序为例:
c
void bubble_Sort(int arr[], int sz)// 可以用数组接收也可以用指针接收
{
int i = 0;
// 排序趟数
for (i = 0; i < sz - 1; i++)
{
// 每一趟冒泡排序
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = 0;
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
c
int arr[] = {5, 8, 7, 3, 15, 9, 10, 2};
int sz = sizeof(arr) / sizeof(arr[0]);
// 排升序
bubble_Sort(arr, sz);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
数组名的理解--除了下面两个特例其余情况下一维数组名代表首元素的地址,二维数组是首行地址
两个特例:
①sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组。
②&数组名,取出的是数组的地址。 &数组名,数组名表示整个数组
c
int arr1[] = {5, 6, 7, 8, 9};
printf("%p\n", arr1); // 0000003f5abff850
printf("%p\n", arr1 + 1); // 0000003f5abff854
printf("----------------\n");
printf("%p\n", &(arr1[0])); // 0000003f5abff850
printf("%p\n", &(arr1[0]) + 1); // 0000003f5abff854
printf("----------------\n");
printf("%p\n", &arr1); // 0000003f5abff850
printf("%p\n", &arr1 + 1); // 0000003f5abff864 即加的是整个数组元素大小20字节 0x16换为10进制是20
c
int arr2[2][3] = {5, 6, 7, 8, 9};
printf("%p\n", arr2); // 0000005ec65ffc90
printf("%p\n", arr2 + 1); // 0000005ec65ffc9c 一行3个元素,12字节
printf("----------------\n");
printf("%p\n", &(arr2[0])); // 0000005ec65ffc90
printf("%p\n", &(arr2[0]) + 1); // 0000005ec65ffc9c
printf("----------------\n");
printf("%p\n", &arr2); // 0000005ec65ffc90
printf("%p\n", &arr2 + 1); // 0000005ec65ffca8 即加的是整个数组元素大小24字节