文章目录
一维数组
二维数组(多维数组)
一维数组
数组由数据类型相同的一系列元素组成,普通变量能使用的类型,数组元素都可以使用
数组声明
int a[10];//包含10个int类型元素的数组 char b[10];//包含10个字符型元素的数组 float c[10];//包含10个float类型元素的数组
方括号[]表示a,b,c都是数组,方括号中的数字表示数组中的元素个数
要访问数组中的元素,通过使用数组下标(索引)来定位数组中的元素,数组的下标是从0开始的,切记a[0];就表示数组a中的第一个元素a[9];表示最后一个元素
数组初始化
int a[4]={1,3,45,7};
花括号括起来用逗号分隔数组元素,注意不支持ANSI的编译器会报错,这时在数组声明前加上关键字 static 可以解决这个问题
使用数组打印每月的天数(包含了数组的定义初始化和使用以及define宏定义和for循环等内容)
#include<stdio.h> #define MONTHS 12 int main(void){ int days[MONTHS] = {31,29,31,30,31,30,31,31,30,31,30,31}; for(int i = 0;i<MONTHS;i++) printf("%d Month have %d days\n",i+1,days[i]); return 0; }
使用const声明只读数组
const int days[MONTHS] = {……};
声明为const便不能再给它赋值,只能读数据,不能写数据
未初始化的数组元素
对于没有进行初始化的元素,编译器会做怎样的处理呢,写代码运行看一下
#include<stdio.h> #define SIZE 4 int main(){ int a[SIZE] = {1,2}; for (int i = 0; i < SIZE; i++) { printf("%d %d\n",i,a[i]); } return 0; }
好,🆗看到编译器把我未初始化元素的值都置为了0(垃圾值(小🐂🐎))
初始化列表的个数多余数组元素的个数时
C会把它视为错误❌,这叫做数组下标越界,其实我们也可以省略掉数组的个数不写,编译器会自己根据列表中的项数来确定数组的大小
int a[] = {3,45,67,789,0,12};
sizeof计算数组大小元素个数
#include<stdio.h> int main(){ int a[] = {12,45,67,3,0,1}; printf("%d\n",sizeof a); printf("%d\n",sizeof a[2]); printf("%d\n",sizeof a[5]); return 0; }
int类型数组一个占用4字节,sizeof a返回了24字节,可知该数组有6个元素,一个元素占用4个字节
指定初始化器(C99)
C99新增一个新特性:指定初始化,从字面就可以看出来该特性可以初始化指定的数组元素
//传统的 int a[5] = {2,5,0,13,14}; //新特性 int a[5] = {2,0,[5]=5};
#include<stdio.h> int main(){ int a[6] = {2,0,[5]=5}; for(int i=0;i<6;i++) printf("%d %d\n",i,a[i]); return 0; }
使用指定初始化器,猜猜结果会输出什么东东
给数组元素赋值
声明数组后,可以借助数组下标(索引)对数组元素进行赋值操作,比如:
/*给数组元素进行赋值*/ #include<stdio.h> #define SIZE 20 int main(){ int i,number[SIZE]; for(i=0;i<SIZE;i++) { number[i] = 2*i; printf("%d %d\n",i,number[i]); } return 0; }
使用了循环给数组的元素一次赋值,C中不允许把数组赋值给数组,除了初始化以外也不允许使用花括号列表的形式赋值。
//无效的数组赋值 int a[4] = {5,2,0,1}; int b[4]; b=a;//这是不被允许的 a[4]=b[5];//下标越界 a[4] = {23,45,67,8};//不起作用
数组边界
在使用数组时,要防止数组下标超过边界。(必须确保下标是一个有效的值)
编译器不会检查数组下标是否使用得当,程序可以运行,但结果可能不尽人意,或者异常终止
为什么C语言不对数组下标进行检查?
好问题,这要归功于C对程序员的信任,不检查边界,使得C程序运行更快一步
我们要记住:数组的下标是从0开始编号,最好在声明数组时使用宏定义来定义数组的大小
指定数组的大小
#define SIZE 4 int a = 5; int b[SIZE];√//整数符号常量 int a1[3];//整数字面常量 int a2[1+1];//√ float a3[sizeof(int)+2];//√ float a4[-1];//×,数组大小必须大于0 float a5[0];//×,数组大小必须大于0 float a6[2.6];//×,数组大小必须是整数 float a7[(int)2.6];//√,已经强制转换成整数 char a8[a];//C99之前不允许
二维数组(多维数组)
初始化二维数组
#define YEAR 3//行 #define MONTH 12//列 const int a[YEAR][MONTH] = { {34,45,23,1,23,34,67,87,90,56,6,7}, {1,23,45,67,78,89,90,34,54,63,67,8}, {1,2,3,4,5,6,7,8,9,10,11,12} };
因为储存的值不想被改动,所以使用const关键字(被const限定后只能读不能写)