什么是数组?数组是由相同类型(记住是相同,不同类型不可以)的一系列数据组成。基本上C语言变量可用的类型,在数组也可使用。
数组的语法如下:
类型 数组标识[长度] ,其中数组的长度或元素个数用方括号括起。如:int arr1[10],声明了10个元素的数组。
- 数组的初始化用花括号把数据括起来,每个数据以逗号分隔。如:int arr1[5] = {1,2,3,4,5}。其中 {1,2,3,4,5}为初始化列表
- 数组要赋值或使用,需要通过数组的下标(索引)的方式,且数组的下标是从0开始到数组长度减1结束。如:printf("%d\n", arr1[0]); 就是打印数组arr1的第1个元素,arr1[4]就是数组的第5个元素。C语言编译器不会检查数组下标是否正确,如果不正确的数组下标就会出现下标越界,会导致程序异常退出。如:arr1[-1]、arr1[6]等,因为这个下标不存在。
- 数组所占用的字节为:数组类型的所占用的字节大小 * 数组元素个数。如上面arr1长度为5的数组它所占用的字节为:sizeof(int) * 5 = 20Byte
- 数组整体是不能被赋值的(即使长度、类型相同也不可以),如把 int arr1[5] 赋值给 int arr2[5]
- 数组之间可通过两种方法实现复制:1、利用循环把每个元素赋值给另一个数组元素;2、利用memory.h头文件声明的memcpy函数进行复制。
来段代码:
#include <stdio.h>
#include <memory.h> //使用了memcpy函数,因此导入相关的头文件
/*
时间:2022-04-10 15:48
作者:sgbl888
功能:学习一维数组
知识点:
1、数组下标从0开始,要注意下标越界问题(编译器不会检查是否越界,若越界会导致程序异常退出)
2、数组使用前须初始化,否则可能是垃圾值,会导致计算结果不正确
3、数组不能整体赋值(即使长度、类型相同也不可以)
4、数组复制可使用memcpy函数(引入memory.h头文件)或使用循环逐个赋值
5、整个数组所占用的字节大小 = 单个数组元素所占用的字节 x 数组元素个数
6、初始化列表只能在声明时使用,不能在赋值时使用
*/
#define MONTHS 12 //一年12个月
int main(){
//声明指定长度的数组
//int year[MONTHS] = {1,2,3,4,5,6}; //初始化列表只给6个元素值,后面6个元素值由编译器填充为0
int year[MONTHS] = {1,[1]=2,3,4,5,6}; //c99标准支持指定给下标的元素赋值
//year = {2,3,4,5,6}; //错误的,不能使用初始化列表进行赋值
int i;
for(i = 0; i < MONTHS; i++){ //下标从0开始,因此i初始值设置为0
printf("%d \t", year[i]);
}
printf("\n-----------------------\n");
//根据初始化列表,自动设置数组大小的数组
char y [] = {}; //并非是空数组,等同于 int y[] = {0},只有一个元素的数组
char x [] = {1,3,5,7,9}; //数组x大小为5,从0-4
printf("%d\n", y[0]);
printf("\n-----------------------\n");
//数组整体赋值演示
char a1[5];
//a1 = x; //错误,不能整体赋值,虽然数组大小、类型相同也是不可以的
//下标越界演示
//printf("%d\n", a1[6]); //这两种都是错误的,因为数组下标从0开始到长度-1。
//printf("%d\n", a1[-1]);
//数组所占用的字节计算
printf("\nyear数组所占用的字节为:%d Byte\n", sizeof(int) * MONTHS); //因为有12个元素,int类型占用4字节。结果为48个字节
printf("\n-----------------------\n");
//数组整体复制的两种方法:循环赋值、memcpy函数
for(i = 0; i < 5; i++){
a1[i] = x[i]; //把x的第i个元素赋值给a1的第i个元素
printf("%d\n", a1[i]); //打印是否成功
}
printf("\n-----------------------\n");
//使用memcpy函数复制数组
char a2[5];
memcpy(a2, a1, sizeof a1); //第一个参数为目标数组,第二个参数为原始数组,第三个参数为要复制的字节数(非数组个数)
printf("%d\n", a2[2]); //打印出5,说明复制成功
return 0;
}