定义 | 同一类型多个元素的集合 --- | --- 本质 | 一片连续的内存空间 内存分布 | 数组在内存的分布式连续排列的 # 数组的初始化示例 ```c #include <stdio.h> int main(int argc, char const *argv[]) { int a[4];//初始化的时候就已经申请了内存了 for (int i = 0; i < 4; ++i) { a[i] = i; } for (int i = 0; i < 4; ++i) { printf("%d,%p\n", a[i],&a[i]); } return 0; } ``` 执行结果如下 ```js 0,0x7fff5fa2ca70 1,0x7fff5fa2ca74 2,0x7fff5fa2ca78 3,0x7fff5fa2ca7c ``` # 细看初始化 ## 数值类型初始化 初始化 | 内存占用 | 描述 ------- | ------- | ------- `int num1[3] = {1,2,3};` | 12 | 正常赋值 `int num2[3] = {1,2};` | 12 | 没有初始化的元素,填充为0。 `double num3[3] = {1,2};` | 24 | 不足的元素,填充为`0.0000...` , 数组类型声明,对其进行转换 `double num4[] = {1,2};` | 16 | 确定了元素个数,可以省略中括号里面的元素个数的描述 占用内存我是以我当前环境为参考 https://mengkang.net/989.html ## char 数组初始化 初始化 | 内存占用 ------- | ------- `char a[] = {'a','b','c','d'};` | 4 `char b[4] = {"abcd"};` | 4 `char c[] = {"abcd"};` | 5 `char d[4] = "abcd";` | 4 `char e[] = "abcd";` | 5 双引号初始化的时候,如果申请的内存空间够用的情况下,会在末尾放置一个`\0`。 知识是网状的,这块和字符串的知识相关联,但是初始化却是数组的,所以在这里讲解吧。 下面是字符数组的两种初始化 ```c #include <stdio.h> int main(int argc, char const *argv[]) { char a[] = {'a', 'b', 'c', 'd'}; printf("a 的长度 %lu\n", sizeof(a)); for (int i = 0; i < sizeof(a); ++i) { printf("%c,ascii 码为 %d\n", a[i], a[i]); } return 0; } ``` 结果为 ```c a 的长度 4 a,ascii 码为 97 b,ascii 码为 98 c,ascii 码为 99 d,ascii 码为 100 ``` 特殊的初始化,双引号多字符组合初始化: ```c #include <stdio.h> int main(int argc, char const *argv[]) { char a[] = "abcd"; printf("a 的长度 %lu\n", sizeof(a)); for (int i = 0; i < sizeof(a); ++i) { printf("%c,ascii 码为 %d\n", a[i], a[i]); } return 0; } ``` 结果 ``` a 的长度 5 a,ascii 码为 97 b,ascii 码为 98 c,ascii 码为 99 d,ascii 码为 100 ,ascii 码为 0 ``` 发现在初始化的时候,在字符串的末尾添加了一个`ascii`码为`0`的字符`\0`,这时候字符串的终止符,**这就是双引号初始化的特殊性**。 # 二维数组 ```c type arrayname[x][y]; ``` 初始化方式列举 ```c #include <stdio.h> int main(int argc, char const *argv[]) { int a[2][3] = { {1, 2, 3}, {4, 5, 6} }; for (int i = 0; i < 2; ++i) { for (int j = 0; j < 3; ++j) { printf("%d\n",a[i][j]); } } return 0; } ``` ```c #include <stdio.h> int main(int argc, char const *argv[]) { int a[2][3] = {1, 2, 3, 4, 5, 6}; for (int i = 0; i < 2; ++i) { for (int j = 0; j < 3; ++j) { printf("%d\n",a[i][j]); } } return 0; } ``` 上面两种效果一样。 ```c int main(int argc, char const *argv[]) { int a[2][3] = {1}; for (int i = 0; i < 2; ++i) { for (int j = 0; j < 3; ++j) { printf("%d\n",a[i][j]); } } return 0; } ``` 输出结果 ```c 1 0 0 0 0 0 ``` 和一维数组一样,其他未声明的内存都用`0`都填充。因为类型是`int`