8.1 一维数组

关于数组输入的问题
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a[5] = {0};
  5. // input
  6. for(int i=0;i<5;i++)
  7. {
  8. scanf("%d",&a[i]);
  9. }
  10. printf("output\n");
  11. // output
  12. for(int i=0;i<5;i++)
  13. {
  14. printf("%d ",a[i]);
  15. }
  16. }
  17. // 输出
  18. 1
  19. 2
  20. 3
  21. 4
  22. 5
  23. output
  24. 1 2 3 4 5

8.1.3 数组初始化

如果初始化比数组短,那么剩余位用 0 代替
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a[10] = {1,2,3};
  5. for(int i=0;i<10;i++)
  6. printf("%d ",a[i]);
  7. }
  8. // 输出
  9. 1 2 3 0 0 0 0 0 0 0

显式的初始一个数组,可以省略数组长度
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a[] = {1,2,3,4,5};
  5. for(int i=0;i<5;i++)
  6. printf("%d ",a[i]);
  7. }
  8. // 输出
  9. 1 2 3 4 5

8.1.5 对数组使用 sizeof 运算符

sizeof 用来确定数组的大小(字节数)
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a[] = {1,2,3,4,5};
  5. printf("%d 字节",sizeof(a));
  6. }
  7. // 输出
  8. 20 字节

sizeof 计算数组元素的大小
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a[] = {1,2,3,4,5};
  5. printf("%d 字节",sizeof(a)/sizeof(a[0]));
  6. }
  7. // 输出
  8. 5 字节

sizeof 计算的数组大小可以不改变循环
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a[] = {1,2,3,4,5};
  5. for(int i=0;i<sizeof(a)/sizeof(a[0]);i++)
  6. a[i]=0;
  7. }
  8. // 当数组长度发生改变时,也不需要改变循环体

8.2 多维数组

多维数组逻辑图

image.png

多维数组物理图(行主序存储)

image.png

8.2.1 数组初始化

常规初始化(所有项都填满)
  1. int main()
  2. {
  3. int a[2][3] = {{1,2,3},{4,5,6}};
  4. for(int i=0;i<2;i++)
  5. {
  6. for(int j=0;j<3;j++)
  7. {
  8. printf("%d ",a[i][j]);
  9. }
  10. printf("\n");
  11. }
  12. }
  13. /**** or ****/
  14. // 可以忽略行数,但不能忽略列数 a[][3]
  15. #include <stdio.h>
  16. int main()
  17. {
  18. int a[][3] = {{1,2,3},{4,5,6}};
  19. for(int i=0;i<2;i++)
  20. {
  21. for(int j=0;j<3;j++)
  22. {
  23. printf("%d ",a[i][j]);
  24. }
  25. printf("\n");
  26. }
  27. }
  28. // 输出
  29. 1 2 3
  30. 4 5 6

未填满位赋值为 0
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a[][3] = {{1,2,3},{4,5}};
  5. for(int i=0;i<2;i++)
  6. {
  7. for(int j=0;j<3;j++)
  8. {
  9. printf("%d ",a[i][j]);
  10. }
  11. printf("\n");
  12. }
  13. }
  14. // 输出
  15. 1 2 3
  16. 4 5 0

8.2.2 常量数组

常量的关键字是 const,和 java 中的 final 关键字类似,即初始化后不能在改变

  1. #include <stdio.h>
  2. int main()
  3. {
  4. const int a[][3] = {{1,2,3},{4,5}};
  5. for(int i=0;i<2;i++)
  6. {
  7. for(int j=0;j<3;j++)
  8. {
  9. a[i][j] = 0;
  10. }
  11. }
  12. }
  13. // 报错
  14. [Error] assignment of read-only location 'a[i][j]'