定义 | 同一类型多个元素的集合
--- | ---
本质 | 一片连续的内存空间
内存分布 | 数组在内存的分布式连续排列的
# 数组的初始化示例
```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`