一维数组
定义一维数组的一般形式为
类型符 数组名[常量表达式]
(1)数组名的命名规则和变量名相同,遵循标识符命名规则。
(2)在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。例如,student[10],表示a数组有10个元素。注意,下标是从0开始的,这10个元素分别是student[0]...student[9]。一定要注意这里面不会有student[10].
(3)常量表达式中可以包括常量和符号变量,如“int a[4*2]”是合法的。但是不能包括变量,如下面的就是不合法的:
int n;
scanf("%d",&n);
int b[n];
经过上面的定义,在内存中划出一片存储空间(空间大小:4*10=40字节),存放一个含有10个整形元素的数组。
- 一维数组的初始化
(1)全部赋值:int a[10]={0,1,2,3,4,5,6,7,8,9}
a[0]=0,a[1]=1,a[2]=2,a[3]=3,a[4]=4,a[5]=5,a[6]=6,a[7]=7,a[8]=8,a[9]=9;
(2)部分元素赋值:int a[10]={0,1,2,3};
部分赋值中,除被赋值元素外,其余元素被初始化为0。
- 一维数组应用(冒泡排序)
#include <stdio.h>
int main ()
{
int i,j,stscore[10];
for(i=0;i<10;i++)
{
stscore[i]=rand();
printf("stscore[%d]=%d\n",i,stscore[i]);
}
for(i=0;i<=9;i++){
for(j=i+1;j<=9;j++){
int temp;
if(stscore[i]<stscore[j]){
temp=stscore[i];
stscore[i]=stscore[j];
stscore[j]=temp;
}
}
}
for(i=0;i<10;i++)
{
printf("stscore[%d]=%d\n",i,stscore[i]);
}
return 0;
二维数组
二维数组的定义方法和一维数组类似,其一般形式为:
类型说明符 数组名[常量表达式][常量表达式]
例如:
float a[3][4];
c语言中,二维数组在内存中存放的顺序是按行存放的,即在内存中先顺序存放第一行元素,接着再来存放第二行元素。
假设数组存放是从2000开始的,一个元素占用4个字节,下图就是a[3][4]在内存中存放的具体形式。
- ** 二维数组的初始化**
(1)分行给二维数组赋初值。例如:
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
这种赋值方法比较直观,把第一个花括号的值给第0行元素,第2个花括号的值给第一行元素....
(2)可以将所有的数据放在一个花括号内,例如:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
效果和(1)相同。但是很显然第一种方式较好,一行对一行,界限很清楚。用第二种方法如果数据多,则会写成一大片,容易遗漏。
(3)可以对部分元素赋初值。例如:
int a[3][4]={{1},{3},{5}};
它的作用是只给各行第0列的元素赋初值,其他元素默认为0.赋初值后的结果为:
1 0 0 0
3 0 0 0
5 0 0 0
字符数组
前面我们已经讲解过,字符型数据是以字符的ASCII代码存储在存储单元中的,一般占一个字节。由于ASCII代码属于整数形式,因此,把字符型归纳为整数类型中的一种。
由于字符数据的应用十分广泛,尤其是作为字符串形式的使用,有其自己的特点,我们单独成节来讲述该内容。
注意:c语言中没有字符串类型,字符串都是存储在字符型数组中的。
- 字符数组的定义
定义字符数组的方法与定义数值型数组的方法类似:例如:
char c[10];
以上就定义了c为字符数组,包含10个元素。
- 字符数组的初始化
把各个字符以此赋给数组中格元素。例如:
char c[10]={'I',' ','a','m',' ','h','a','p','p','y'};```
把这10个字符以此赋给c[0]~c[9]这10个元素。
**注意:**上面例子中花括号提供的初值个数(即字符个数)等于数组长度,倘若花括号中的提供初值个数大于数组长度,则会出现语法错误。**倘若初值个数小于数组长度**,则只将这些字符赋给数组中前面那些元素,其余元素自动定为空字符(即''\0').例如:
char c[10]={'I',' ','l','o','v','e',' ','c'};
该数组在内存的存储状态如下:
![Alt text](http://upload-images.jianshu.io/upload_images/815734-67855bda0a28468e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
在定义数组时可以省略数组长度,系统会自动根据处置个数确定数组长度。例如:
char c[]={'I',' ','a','m',' ','h','a','p','p','y'};
数组c的长度自动定为10.这种方式不用人工去数字符的个数,尤其在赋初值字符个数不较多的情况下,比较方便。
- **字符串和字符串结束标志**
在c语言中,是将字符串作为字符数组来处理的。在平时的应用中,人们往往关心的是字符串的有效长度而不是字符数组的长度。例如,定义一个字符数组长度50,而实际有效字符只有30个。为了测定字符串的实际长度,c语言规定了一个“字符串结束标志('\0')”,以字符'\0'作为结束标志。如果字符数组中存在若干字符,前面9个字符都不是空字符('\0'),而第10个字符是'\0',则认为数组中有一个字符串,其有效字符为9个。
c系统在用字符数组存储字符串常量时会自动加一个'\0'作为结束符。
例如:
printf("Shiyanlou");
在执行次语句时系统怎么知道该输出到哪里为止呢?实际上,在向内存中存储时,系统自动在最后一个字符'u'后面加一个'\0'作为字符串结束标志。在执行printf函数时,每输出一个字符检查一次,看下一个字符是否为'\0',遇到'\0'就停止输出。
![Alt text](http://upload-images.jianshu.io/upload_images/815734-51d4fab441d69b98.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
有了上述理解,在对字符数组初始化的方法上面我们做出一些补充。例如:
char[]={I love shiyanlou};
我们也可以直接省去花括号:
char[]="I love shiyanlou";
这里不像之前单个字符作为字符数组的初值,而是用字符串作为初值(**字符串做初值是用双撇号而不是单撇号**)。这种方法更直观、更方便。
**注意:**此时数组的长度是17,而不是16,因为**字符串常量的最后系统自动加了一个'\0'**;。上面的初始化与下面的初始化等价的。
char c[]={char c[]={'I',' ','l','o','v','e',' ','s','h','i','y','a','n','l','o','u','\0'};};
和下面的这个不等价:
char c[]={'I',' ','l','o','v','e',' ','s','h','i','y','a','n','l','o','u'};
##参考文献
[1][实验楼C 语言入门教程](https://www.shiyanlou.com/courses/running)