定义 | 同一类型多个元素的集合 |
---|---|
本质 | 一片连续的内存空间 |
内存分布 | 数组在内存的分布式连续排列的 |
数组的初始化示例
#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;
}
执行结果如下
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
。
知识是网状的,这块和字符串的知识相关联,但是初始化却是数组的,所以在这里讲解吧。
下面是字符数组的两种初始化
#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;
}
结果为
a 的长度 4
a,ascii 码为 97
b,ascii 码为 98
c,ascii 码为 99
d,ascii 码为 100
特殊的初始化,双引号多字符组合初始化:
#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
,这时候字符串的终止符,这就是双引号初始化的特殊性。
二维数组
type arrayname[x][y];
初始化方式列举
#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;
}
#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;
}
上面两种效果一样。
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;
}
输出结果
1
0
0
0
0
0
和一维数组一样,其他未声明的内存都用0
都填充。因为类型是int