(1)数组是一组有序数据的集合。数组中个数字的排列是有一定规律的,下标代表数据在数组中的序号。
(2)用一个数组名(如s)和下标(如15)来唯一确定数组中的元素,如 s 1 5 s_15 s15 就代表数组中的第15个元素。
(3)数组中的每一个元素都属于同一个数据类型。不能把不同的数据类型放在一个数组中。
定义一维数组的一般形式为:
类型符 数组名[常量表达式]
如:
int a[10];
注意:
(1)数组名的命名规则和变量名相同,遵循标识符明明规则。
(2)在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。需要注意的是,a[10]表示a数组有10个元素,下标从0开始到9,不存在数组元素a[10]。
(3)常量表达式中可以包含包括常量和符号常量,如“int a[3+5]”是合法的。不能包含变量,如“int a[n]”是不合法的。
引用数组元素的表示形式为
数组名[下标]
为了使程序简介,常在定义数组的同时给各数组元素赋值,作者称为数组的初始化。
(1)在定义数组时对全部数组元素赋予初值,如:
int a[10]={0,1,2,3,4,5,6,7,8,9};
(2)可以只给数组中的一部分元素赋值,如:
int a[10]={0,1,2,3,4};
定义a数组有10个元素,但花括号内只提供5个初值,这表示只给前面5个元素赋初值,系统自动给后5个元素赋初值为0.
(3)如果想使一个数组中全部元素值为0,可以写成:
int a[10]={0,0,0,0,0,0,0,0,0,0}; //(1)
//或者
int a[10]={0}; //(2)
(4)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度,例如:
int a[5]={1,2,3,4,5};
//可以写成
int a[]={1,2,3,4,5};
如果数组长度与提供初值的个数不相同,则方括号中的数组长度不能省略。
例1:用数组来处理斐波那契数列问题
# include
int main(){
int i;
int f[20]={1,1};
for (i=2;i<20;i++){
f[i]=f[i-2]+f[i-2];
}
for (i=0;i<20;i++){
if (i%5==0)printf("\n");
printf("%12d",f[i]);
}
printf("\n");
return 0;
例2:冒泡排序
# include
int main(){
int a[10];
int i,j,k,t;
printf("please enter ten number:\n");
for (i=0;i<10;i++){
scanf("%d",&a[i]);
}
for (j=10;j>0;j--){
for (k=0;k<j;k++){
if(a[k]>a[k+1]){
t = a[k];
a[k] = a[k+1];
a[k+1] = t;
}
}
}
printf("from small to big:\n");
for (i=0;i<10;i++){
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
二维数组定义的一般形式为:
类型说明符 数组名[常量表达式][常量表达式]
C语言中,二位数数组中元素排列的顺序是按行存放的,即在内存中先顺序存放第一行的元素,接着再存放第二行的元素。
用矩阵形式表示二维数组,是逻辑上的概念,能形象地表示出行列关系。而在内存中,各元素是连续存放的,不是二维的,是线性的。
C语言还允许使用多维数组,有了二维数组的基础,再掌握多维数组并不困难。
二维数组元素的表达形式为
数组名 [下标][下标]
下标应是整型表达式。
(1)分行给二维数组赋初值,如:
int a[3][4]={{1,2,3,4}.{5,6,7,8},{9,10,11,12}};
(2)可以将所有数据写在一个花括号内,按数组元素在内存中的排列顺序对各元素赋初值,如:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
(3)可以对部分元素赋初值,如:
int a[3][4]={{1},{5},{9}};
int a[3][4]={{1},{ },{9}};
(4)如果对全部元素都赋初值(即提供全部初始数据),即定义数组时对第1维的长度可以不指定,但第2维的长度不能省,如:
int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int a[][4]={{0,0,3},{},{0,10}};
例1 将一个二维数组行和列元素互换,存到另一个二维数组中
# include
int main(){
int a[2][3] = {{1,2,3},{4,5,6}};
int b[3][2];
for (int i=0;i<2;i++){
for (int j=0;j<3;j++){
b[j][i]=a[i][j];
}
}
printf("this is b:\n");
for (int i=0;i<3;i++){
for (int j=0;j<2;j++){
printf("%d ",b[i][j]);
}
printf("\n");
}
return 0;
}
例2 有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号
# include
int main(){
int a[3][4]={{1,5,6,2},{0,14,-5,68},{100,99,1,3}};
int row=0,column=0,max=a[row][column];
for (int i=0;i<3;i++){
for (int j=0;j<4;j++){
if (a[i][j]>max){
max=a[i][j];
row=i;
column=j;
}
}
}
printf("the biggest one is:%d,which is located in row %d,column %d\n",max,row,column);
return 0;
}
char c[3];
c[0]='I';
c[1]=' ';
c[2]='a'
由于字符型数据是以整数形式存放的,因此也可以用整型数组来存放字符数据,如
int c[10];
c[0]='a'; //合法,但浪费存储空间
(1)初始化列表,把各个字符一次赋给数组中各元素,如:
char c[5]={'i','A',' ','.',','};
(2)若在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。如果花括号中提供的初值个数大于数组长度,则出现语法错误。如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(‘\0’)
(3)如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。
同之前的引用方式
在C语言中,是将字符串作为字符数组来处理的。为了测定字符串是实际长度,C语言规定了一个”字符串结束标志“,以字符’\0’作为结束标志。
基于以上,我们可以获得一个新的字符数组初始化方法:
char c[]="I am happy"; //可以加上花括号,也可以省略
//等效于
char c[]={'I',' ','a','m','','h','a','p','p','y','\0'}; //注意'\0',是字符串的结束标志
其一般形式为:puts(字符数组)
其作用是将一个字符串(以’\0’结束的字符序列)输出到终端。在用puts输出时将字符串结束标志’\0’转换成’\n’,即输出完字符串后换行。
其一般形式为:gets(字符数组)
其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。一般利用gets函数的目的是向字符数组输入一个字符串,而不太关心其函数值。
其一般形式为:strcat(字符数组1, 字符数组2)
其作用是把两个字符数组中的字符串连接起来,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值——字符数组1的地址。
注意:
(1)字符数组1必须足够大,以便容纳连接后的新字符串。否则会报错。
(2)连接前两个字符串的后面都有’\0’,连接时将字符串1后面的’\0’取消,只在新串最后保留’\0’。
其一般形式为strcpy(字符数组1, 字符串2)
其作用是将字符串2复制到字符数组1中去。
注意:
(1)字符数组1的长度不应小于字符串2的长度
(2)“字符数组1”必须写成数组名形式,“字符串2”可以是字符数组名,也可以是一个字符串常量。
(3)如果在复制前未对字符数组1初始化或赋值,则字符数组1各字节中的内容是无法预知的,复制时将字符串2中的字符串和其后的’\0’一起复制到字符数组1中,取代字符数组1中的前几个字符,剩下的几个并不一定是’\0’,而是字符数组1中原有的最后几个字节的内容。
(4)不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。字符串数组名是一个地址常量,不能被改变。只能用strcpy函数将一个字符串复制到另一个字符数组中去。用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。
(5)可以用strncpy函数将字符串2中前面n个字符复制到字符数组1中去,其形式为:strncpy(字符数组1, 字符串2, n)作用是将字符串2中最前面的n个字符复制到字符数组1中,取代字符数组1中原有的最前面n个字符。但赋值的字符个数n不应多于字符数组1中原有的字符(不包括’\0’)
其一般形式为:strcmp(字符串1, 字符串2)
其作用是比较字符串1和字符串2。字符串比较的规则是:将两个字符串自左至右逐个字符相比(按照ASCII码值大小比较),直到出现不同的字符或遇到’\0’为止。如果全部字符相同,则认为两个字符串相等;若出现不相同的字符,则以第1对不相同的字符的比较结果为准。比较的结果由函数值带回。
(1)若字符串1与字符串2相同,则函数值为0;
(2)若字符串1>字符串2,则函数值为一个正整数;
(3)若字符串1<字符串2,则函数值为一个负整数;
其一般形式为:strlen(字符数组)
其作用为测字符串长度,函数的值为字符串中的实际长度(不包括’\0’在内)。也可以直接测试字符串常量的长度。
其一般形式为:strlwr(字符串)
其作用是将字符串中的大写字母换成小写字母。
其一般形式为:strupr(字符串)
其作用是将字符串中的小写字母换成大写字母。
注意:在使用字符串处理函数时,应当在程序文件的开头用以下语句将string.h文件包含到本文件中。
# include
略