数组
数组(array)是同于存储的一系列类型相同的数据。数组有一个数组名,通过下标访问数组中的元素(element)。
数组的定义语法
dataType arrayName[length];
//其中,dataType为数据类型,arrayName为数组名,length为数组长度。
例如
double money[20];
/*声明的money是一个内含20个元素的数组,每个元素都是一个double类型的值。数组的第一个元素是money[0],
第二个元素是money[1],以此类推,直到money[19]。注意,数组元素的编号从0开始,不是从1开始。可以给每个
元素赋double类型的值,比如*/
money[0]=10.5;
money[1]=12.55
money[2]=100.6
...
money[20]=1200.3
- 定义数组的时候,数组的长度必须是整数,可以是常量也可以是变量。
- 数据的下标也必须是整数,可以是常量,也可以是变量。
- 使用数组元素和使用同类型变量一样。例如,可以这样把值读入指定元素中:
scanf("%lf",&money[4]);//把一个值读入数组的第五个元素。
数组可以是任意类型的数据
int iArray[10];//定义int型数组
double dArray[10];//定义double类型数组
char cArray[10];//定义char型数组
数组的初始化
采用memset函数对数组进行初始化,如下
memset(iArray,0,sizeof(iArray));
memset(dArray,0,sizeof(dArray));
memset(cArray,0,sizeof(cArray));
//第一个参数是数组名,第二个参数填0,第三个参数是数组占用的内存空间,用sizeof(变量名)获取。
注意事项:
- 定义数组的时候,数组的大小必须是整数,可以用常量和变量。
int size = 100;
iibt numeber[size];
在很久以前,数组是只支持常量的,后来支持了变量,有些旧教材仍认为只支持常量,但显然不是了。
对于C语言这是一个进步,C语言的动态内存技术的应用范围将变得更小。- 使用数组的时候,数组的下标也必须是整数,可以用常量和变量。
- 使用数组的时候 C语言并不会检查下标是否正确,但是在程序中下标一定不能越界。当运行程序时下标越界,这会导致数据被放置在已经被其他数据占用的地方,可能会破坏程序的结果甚至导致程序异常中断,后果异常严重。比如
int ii = 0;
int number[5];
for(ii=0;ii<100;ii++)
{
number[ii]=ii;//数组只有五个元素,这样些会使数组有100个元素,超出范围
}
运行结果会是段错误(core dumped),就是非法内存操作,会导致程序崩溃。
在for循环中运用数组
利用for循环取访问数组的每一个元素,实现遍历。
比如,我们要统计每个同学的身高可以这样写。
int studentHeight[20];
for(int ii = 0;i<20;i++)
{
printf("请输入第%d名的体重",ii+1);
scanf("%d",studentHeight[ii]);
}
//这样就通过for循环为数组的20个元素依次赋予输入值
二维数组
在生活中,随处可见二维数组。比如一栋房子有10层,每层都有两户人家。
二维数组的定义
dataType arrayName[length1][length2];
//其中,dataType为数据类型,arrayName为数组名,length1为一维下标,length2为二维下标。
我们可以把二维数组看作一个excel表格,一维为行,二维为列。想要在二维数组中精确的找到某个元素,需要确定行和列。比如,
int troop[5][4];
//这就定义了一个五行四列的数组,一共有5*4=20个元素。
也可以看作坐标,一个元素就是一个坐标对数,想要确定元素坐标,需要知道他的横坐标和纵坐标。
二维数组的初始化
二维数组的初始化也是用memset函数,例如memset(troop,0,sizeof(troop));
多维数组
从二维数组就能推断出多维数组的定义方法,但在实际应用中二维数组的使用非常的少。
C语言中的字符串
字符串是一个特别的字符数组,如果字符数组包含表示字符串末尾的空字符‘\0’,则该数组中的内容就构成了一个字符串。
'\0’可以直接写成0。
you can do it.
是字符数组,不是字符串
you can do it.\0//“\0”表示空字符
即是字符数组,也是字符串。
这是约定俗成的规则,没有道理
因为需要用“\0”空字符结尾,所以定义字符串的时候,字符串的长度要多预留一个字节。
char strName[21]//这便是定义一个最多放20个字符或者10个汉字的字符串。
空字符“\0”,也就是0,假设我们想把hello写入字符串可以这样写
char strHello[0]='H';
char strHello[1]='e';
char strHello[2]='l';
char strHello[3]='l';
char strHello[4]='o';
char strHello[5]='\0';//或者char strHello[5]=0;也可以
那么,如果我们的结尾不用空字符\0会怎么样?
答案是会产生乱码,比如hello!,hello~,hello$等等,因为,如果最后不用空字符,数组会一直寻找最后一个元素,就会找到一些莫名其妙的垃圾值。
字符串数组
以0结束的一维字符数组是一个字符串,给一维字符数组加上一维,就是字符串数组了。
char strname[21]; //可以存放20个字符的字符串
memset(strname,0,sizeof(strname));
strcpy(strname,"我可以存放十个汉字");
char strname[10][21];//10个字符串,每个字符串可以存放20个字符
memset(strname,0,sizeof(strname));
strcpy(strname[0],"妲己");
strcpy(strname[1],"西施");
strcpy(strname[2],"貂蝉");
strcpy(strname[4],"王昭君");
strcpy(strname[5],"小乔");
...
strcpy(strname[9],"甄姬");
字符串数组是一个二维数组,定义了单个字符串的长度,和字符串的数量。