前言
本篇文章介绍C语言中数组的初始化的各种方式
直接初始化
int intArray[2]={1,2};
char charArray[2]={'a','b'};
部分初始化
#include <stdio.h>
int main(void)
{
int intArray[3]={1,2};
char charArray[3]={'a','b'};
for(int i=0;i<3;i++)
{
printf("int[%d] = %d\n",i,intArray[i]);
printf("char[%d] = %c, code = %hhu\n",i,charArray[i],charArray[i]);
}
getchar();
return 0;
}
结果如下:
int[0] = 1
char[0] = a, code = 97
int[1] = 2
char[1] = b, code = 98
int[2] = 0
char[2] = , code = 0
当初始化列表中的值少于数组元素个数时,编译器会把int数组后面的值初始化为0,字符数组则初始化为空字符
初始化列表数据太多
#include <stdio.h>
int main(void)
{
int intArray[1]={1,2,3,4};
char charArray[1]={'a','b','c','d'};
for(int i=0;i<4;i++)
{
printf("int[%d] = %d\n",i,intArray[i]);
printf("char[%d] = %c, code = %hhu\n",i,charArray[i],charArray[i]);
}
getchar();
return 0;
}
结果如下:
int[0] = 1
char[0] = a, code = 97
int[1] = 0
char[1] = , code = 1
int[2] = 1876948320
char[2] = , code = 0
int[3] = 1
char[3] = , code = 0
当初始化列表中的值大于数组元素个数时,编译器会给出警告或者错误,并舍弃多余的值
,如果我们访问数组索引之外的值,得到的数据是内存原本就有的数据
我们在初始化数组时,可以不指定数组大小,编译器会根据初始化列表的长度自动设置数组的大小
。
指定初始化器
C99提供了指定初始化器的新特性,使用该特性,我们可以指定数组部分值而不用所有值都列出来。看下面的例子:
#include <stdio.h>
int main(void)
{
int intArray[10]={1,[3]=30,3,[2]=10,4,2,7,8};
printf("intArray:[");
for(int i=0;i<10;i++)
{
printf("%d",intArray[i]);
if(i<9)
{
printf(", ");
}
}
printf("]\n");
getchar();
return 0;
}
运行结果
intArray:[1, 0, 10, 4, 2, 7, 8, 0, 0, 0]
指定初始化器的规则如下:
- 初始化从左到右依次进行,也就是
后面的赋值可以覆盖前面的赋值
- 如果有一个初始化器赋值,后面的元素
依此紧跟着初始化器指定的当前索引往后赋值
变长数组
C99标准可以使用变量来声明数组
int n=0;
printf("input array length.\n");
scanf("%d",&n);
int intArray[n];
这样是可以的,但是C11是可选的,默认情况下,mac是可以的,visual studio不可以,linux用gcc编译器不指定-std的默认情况下也是可以的
多维数组的初始化
多维数组的初始化我们可以看作多组一维数组的初始化,初始化规则是一致的
#include <stdio.h>
int main(void)
{
int arr[10][10]={
{1,2,[5]=2,4,6,[1]=0},
{1},
[5]={2,[9]=99}
};
for(int i = 0;i<10;i++)
{
for(int j = 0;j<10;j++)
{
printf("%d, ",arr[i][j]);
}
printf("\n");
}
getchar();
return 0;
}
运行结果
1, 0, 0, 0, 0, 2, 4, 6, 0, 0,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2, 0, 0, 0, 0, 0, 0, 0, 0, 99,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,