数组的概念
- 数组是一种构造数据类型,用户可以根据自己的需求灵活分配占用空间大小和格式
- 数组是同种类型的数据连续存储(地址是连续的)
数组的定义
语法
- 数组名 [ 数组元素个数 ]
- 数组名 [ 数组元素个数 ]={ 元素取值列表 }
注意事项:
1)数据类型可以是任意类型(基本类型和构造类型)
2)数组名要简单直观,遵循之前讲的命名规则
3)数组名就是数组的首地址
4)数组定义时候数组元素个数必须是明确的常量
5)采用初始化列表对数组元素赋初值,元素个数固定情况下[]下标(元素个数)可以省略不写
6)局部数组(局部变量) 如果没有初始化,元素初值未知
7)数组一旦初始化,就是整个空间的初始化
8)单个数组元素可以看作是数组类型的一个变量和整体数组其他元素关系不大
9)元素下标从 0 开始
数组的初始化和元素引用
#include <stdio.h>
int main(void)
{
// 数组类型 数组名[元素个数];
int Num1[12]; // 定义数组
// [ 数组元素个数 ]={ 元素取值列表 }
int Num2[12]={1,2,3,4,5,6,7,8,9,0,1,2};
}
#include <stdio.h>
int main(void)
{
// 元素个数固定的情况下,元素定义的个数下标可以
int Num[]={1,2,3,4,5,6,7,8,9,0,1,2};
int i;
for(i=0;i<12;i++)
{
printf("Num[%d]=%d\n",i,Num[i]);
}
}
#include <stdio.h>
int main(void)
{
int Num[]={1,2,3,4}; // 下标省略,编译器会换算元素个数自动填充
int i; // 数组 4 个元素
for(i=0;i<12;i++) // 超出数组的地址空间,不属于数组,数值未知,实际一定要避免这种空间溢出的情况
{
printf("Num[%d]=%d\n",i,Num[i]);
}
#include <stdio.h>
int main(void)
{
int Num[12]={0}; // 局部数组如果定义时候没有初始化使用
int i; // 习惯上写初始化列表{0},给数组初始化为 0
for(i=0;i<12;i++)
{
printf("Num[%d]=%d\n",i,Num[i]);
}
}
#include <stdio.h>
// 利用 scanf 标准输入函数对数组元素初始化
int main(void)
{
int Num[12];
int i;
for(i=0;i<12;i++)
scanf("%d",&Num[i]); // 每次输入存放到单个元素的地址当中
// 单个元素就是数组类型的一个普通变量 取地址
// scanf 以空格作为输入分割
for(i=0;i<12;i++)
scanf("%d",&Num[i]); // 每次输入存放到单个元素的地址当中
// 单个元素就是数组类型的一个普通变量 取地址
// scanf 以空格作为输入分割
for(i=0;i<12;i++)
printf("Num[%d]=%d\n",i,Num[i]);
}
二维数组
语法:
- 数组类型 数组名[行][列];
- 数组类型 数组名[行][列]={{第 0 行元素初值列表},{第 1 行元素初值列表},…………};
注意事项:
1)数组元素个数固定,数组定义行的下标可以省略
2)数组初始化列表可以不区分行进行依次排列初始化
3)元素可以间断赋值
4)行列起始都是从 0 开始
5)注意字符串二维数组
#include <stdio.h>
int main(void)
{
// 二维数组 0 行 1 行 2 行
int Num[3][4]={{1,2,3,4},{5,6,7,8},{9,0,1,2}};
printf("%d\n",Num[1][2]); // 7
}
#include <stdio.h>
int main(void)
{
// 二维数组元素个数固定只允许省略行下标 需要固定格式
int Num[][4]={{1,2,3,4},{5,6,7,8},{9,0,1,2}};
int h,v;
for(h=0;h<3;h++)
{
for(v=0;v<4;v++)
printf("%-3d",Num[h][v]);
printf("\n");
}
}