一、一维数组
1.1、数组声明
int a[100];
1.2、声明同时赋值
int a[5] = {22, 37, 3490, 18, 95};
- 注意
- 数组a声明之后再进行大括号赋值,导致报错。
int a[5];
a = {22, 37, 3490, 18, 95}; // 报错
- 数组a声明之后再进行大括号赋值,导致报错。
1.3、指定位置赋值
- 数组的2号、9号、14号位置被赋值,其他位置的值都自动设为0。
int a[15] = {[2] = 29, [9] = 7, [14] = 48};
1.4、数组访问
int a[] = {1,2,5,6};
//数组的成员从0开始编号
printf("%d",a[0])
1.5、更新数组中的值
int a[] = {1,2,5,6};
//数组的成员从0开始编号
printf("%d",a[0])
a[0] = 99;
printf("%d",a[0])
1.6、获取数组的长度
sizeof 运算符会返回整个数组的字节长度
int a[] = {22, 37, 3490};
int arrLen = sizeof(a); // 12
获取数组的成员数量
// 由于数组成员都是同一个类型,每个成员的字节长度都是一样的
//所以数组整体的字节长度除以某个数组成员的字节长度,就可以得到数组的成员数量。
sizeof(a) / sizeof(a[0])
二、多维数组
2.1、声明
C 语言允许声明多个维度的数组,有多少个维度,就用多少个方括号,比如二维数组就使用两个方括号。
int board[10][10];
2.2、声明同时赋值
int a[2][5] = {
{0, 1, 2, 3, 4},
{5, 6, 7, 8, 9}
};
2.3、初始化指定位置赋值
int b[2][2] = {[0][0] = 1, [1][1] = 2};
2.4、获取数组长度
//获取整个数组的字节数
printf("数组长度 %d\n",sizeof(b));
//获取一维数组的元素个数
printf("数组元素个数 %d\n",sizeof(b) / sizeof(b[0]));
//获取二维数组的元素个数
printf("数组元素个数 %d\n",sizeof(b[0]) / sizeof(b[0][0]));
三、变长数组
变长数组(variable-length array,简称 VLA)
数组arr就是变长数组,因为它的长度取决于变量n的值,编译器没法事先确定,只有运行时才能知道n是多少。
int n = x + y;
int arr[n];
四、数组的地址
4.1、获取数组元素的地址
- 由于数组的起始地址是常用操作,&array[0]的写法有点麻烦,
- C 语言提供了便利写法,数组名等同于起始地址,也就是说,数组名就是指向第一个成员(array[0])的指针。 ```c int a[5] = {11, 22, 33, 44, 55}; int* p; //获取数组元素的地址 p = &a[0];
// 等同于 //int* p = a;
printf(“%d\n”, *p); // Prints “11”
<a name="kRIgq"></a>
#### 4.2、数组指针的加减法
- 利用指针遍历数组
- 如果指针变量p指向数组的一个成员,那么p++就相当于指向下一个成员
```c
int a1[] = {11, 22, 33, 44, 55, 999};
int* p1 = a1;
while (*p1 != 0) {
printf("%d\n", *p1);
p1++;
}
五、数组的复制
5.1、使用循环遍历复制
for (i = 0; i < N; i++)
a[i] = b[i];
5.2、使用 memcpy 复制
memcpy(a, b, sizeof(b));
六、作为参数
6.1、声明参数数组
int sum_array(int a[], int n) {
// ...
}
int a[] = {3, 5, 7, 3};
int sum = sum_array(a, 4);
6.2、变长数组作为参数
int sum_array(int n, int a[n]) {
// ...
}
int a[] = {3, 5, 7, 3};
int sum = sum_array(4, a);
6.3、数组字面量作为参数
// 数组变量作为参数
int a[] = {2, 3, 4, 5};
int sum = sum_array(a, 4);
// 数组字面量作为参数
int sum = sum_array((int []){2, 3, 4, 5}, 4);