- type_t arr_name [const_n];
- //type_t 是指数组的元素类型
- //arr_name 是数组的名字
- //const_n 是一个常量表达式,用来指定数组的大小
- #include
- int main()
- {
- //代码1
- int arr1[10];
- char arr2[10];
- float arr3[1];
- double arr4[20];
- //代码2
- //用宏定义的方式
- #define X 3
- int arr5[X];
- //代码3
- //错误使用
-
- //下面的代码只能支持在C99标准的编译器上编译
- int count = 10;
- int arr6[count];//这种数组是不能初始化的
- //在C99标准之前,数组的大小必须是常量或者常量表达式
- //在C99之后,数组的大小可以是变量,为了支持变长数组
- return 0;
- }
注:在C99标准之前,数组的大小必须是常量或者常量表达式
在C99之后,数组的大小可以是变量,为了支持变长数组
- #include
- int main()
- {
- int arr[10] = { 0 };//数组的不完全初始化
- //计算数组的元素个数
- int sz = sizeof(arr) / sizeof(arr[0]);
- //对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:
- int i = 0;//做下标,此时可以是变量
- for (i = 0; i < 10; i++)
- {
- arr[i] = i;
- }
- //输出数组的内容
- for (i = 0; i < 10; ++i)
- {
- printf("%d ", arr[i]);
- }
- return 0;
- }
二维数组创建时,行数可以忽略不写。并且所有维度的数组其第一个方括号的内容可忽略。
- #include
- int main()
- {
- //数组创建
- int arr1[3][4];//[行数][列数]
- char arr2[4][5];
- double arr3[2][4];
- return 0;
- }
- //数组初始化
- int arr[3][4] = {1,2,3,4};
- int arr[3][4] = {{1,2},{4,5}};
- int arr[][4] = {{2,3},{4,5}};
注意:
花括号中的一个花括号代表一个一维数组的初始化。当里面无花括号分组时,按照顺序从第一个开始逐个进行初始化。余下的未赋值的元素用0初始化。
- #include
- int main()
- {
- int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
- printf("%d", arr[1][2]);
- //二维数组中数下标是这样规定的
- //00 01 02
- //10 11 12
- //20 21 22
- //如此输出便是6
- return 0;
- }
- #include
- int main()
- {
- int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
- int i = 0;
- for (i = 0; i < 3; i++)
- {
- int j = 0;
- for (j = 0; j < 4; j++)
- {
- printf("%d ", arr[i][j]);
- }
- printf("\n");
- }
- return 0;
- #define _CRT_SECURE_NO_WARNINGS
- #include
- int main()
- {
- int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
- int i = 0;
- for (i = 0; i < 3; i++)
- {
- int j = 0;
- for (j = 0; j < 4; j++)
- {
- scanf("%d ", &arr[i][j]);
- }
- }
- for (i = 0; i < 3; i++)
- {
- int j = 0;
- for (j = 0; j < 4; j++)
- {
- printf("%d ", arr[i][j]);
- }
- printf("\n");
- }
- return 0;
- }
.
例题:往往我们在写代码的时候,会将数组作为参数传整个函数,比如我要实现一个冒泡排序函数,将一个整型数组排序。
代码如下:
- #include
- //形参是数组的形式;
- void popo(int arr[], int n)
- //数组名本质上是数组首元素的地址,地址是应该使用指针来接收
- //所以arr[]看似是数组,本质上是指针变量
- {
- //趟数
- int i = 0;
- for (i = 0; i < n - 1; i++)
- {
- //一趟冒泡排序
- int j = 0;
- for (j = 0; j < n - 1 - i; j++)
- {
- if (arr[j] > arr[j + 1])
- {
- //交换
- int x = arr[j];
- arr[j] = arr[j + 1];
- arr[j + 1] = x;
- }
- }
- }
- }
- int main()
- {
- int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
- int n = sizeof(arr) / sizeof(arr[0]);
- popo(arr,n);
- int i = 0;
- for (i = 0; i < n ; i++)
- {
- printf("%d ", arr[i]);
- }
- return 0;
- }
总结:
int arr[ ]
或者int *arr
,两者等价sizeof()
求数组元素个数时,尽量在数组定义时求。因为传参后数组会降维成指针。数组名确实能表示首元素的地址,但是有两个例外:
- sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
- &数组名,这里的数组名表示整个数组,取出的是整个数组的地址
二维数组的数组名也表示数组首元素的地址(这里的首元素是指第一行元素地址)