定義 | 同一類型多個元素的集合
--- | ---
本質 | 一片連續的內存空間
內存分布 | 數組在內存的分布式連續排列的
# 數組的初始化示例
```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`