8.1 一维数组
关于数组输入的问题
#include <stdio.h>
int main()
{
int a[5] = {0};
// input
for(int i=0;i<5;i++)
{
scanf("%d",&a[i]);
}
printf("output\n");
// output
for(int i=0;i<5;i++)
{
printf("%d ",a[i]);
}
}
// 输出
1
2
3
4
5
output
1 2 3 4 5
8.1.3 数组初始化
如果初始化比数组短,那么剩余位用 0 代替
#include <stdio.h>
int main()
{
int a[10] = {1,2,3};
for(int i=0;i<10;i++)
printf("%d ",a[i]);
}
// 输出
1 2 3 0 0 0 0 0 0 0
显式的初始一个数组,可以省略数组长度
#include <stdio.h>
int main()
{
int a[] = {1,2,3,4,5};
for(int i=0;i<5;i++)
printf("%d ",a[i]);
}
// 输出
1 2 3 4 5
8.1.5 对数组使用 sizeof 运算符
sizeof 用来确定数组的大小(字节数)
#include <stdio.h>
int main()
{
int a[] = {1,2,3,4,5};
printf("%d 字节",sizeof(a));
}
// 输出
20 字节
sizeof 计算数组元素的大小
#include <stdio.h>
int main()
{
int a[] = {1,2,3,4,5};
printf("%d 字节",sizeof(a)/sizeof(a[0]));
}
// 输出
5 字节
sizeof 计算的数组大小可以不改变循环
#include <stdio.h>
int main()
{
int a[] = {1,2,3,4,5};
for(int i=0;i<sizeof(a)/sizeof(a[0]);i++)
a[i]=0;
}
// 当数组长度发生改变时,也不需要改变循环体
8.2 多维数组
多维数组逻辑图
多维数组物理图(行主序存储)
8.2.1 数组初始化
常规初始化(所有项都填满)
int main()
{
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 ",a[i][j]);
}
printf("\n");
}
}
/**** or ****/
// 可以忽略行数,但不能忽略列数 a[][3]
#include <stdio.h>
int main()
{
int a[][3] = {{1,2,3},{4,5,6}};
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
}
// 输出
1 2 3
4 5 6
未填满位赋值为 0
#include <stdio.h>
int main()
{
int a[][3] = {{1,2,3},{4,5}};
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
}
// 输出
1 2 3
4 5 0
8.2.2 常量数组
常量的关键字是 const,和 java 中的 final 关键字类似,即初始化后不能在改变
#include <stdio.h>
int main()
{
const int a[][3] = {{1,2,3},{4,5}};
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
a[i][j] = 0;
}
}
}
// 报错
[Error] assignment of read-only location 'a[i][j]'