一、一维数组的定义和引用
1、一维数组的定义
一维数组的定义方式为:
类型说明符 数组名[常量表达式];
1)、一维数组说明
(1)数组名的命名规则和变量名相同,遵循标识符命名规则。
(2)在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。
(3)常量表达式中可以包括常量和符号常量,不能包含变量。也就是说,C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。
2、一维数组元素的的引用
数组必须先定义,然后使用。C语言规定只能逐个引用数组元素而不能一次引用整个数组。
数组元素的表示形式为:
数组名[下标]
下标可以是整型常量或整型表达式。
3、一维数组的初始化
对数组元素的初始化可以用以下方法实现。
(1)在定义数组时对数组元素赋予初值。
(2)可以只给一部分元素赋值。
(3)如果想使一个数组中全部元素值为0,可以写成:
int a[10]={0,0,0,0,0,0,0,0,0,0}; 或 int a[10]={0};
不能写成: int a[10]={0*10};
这是与FORTRAN语言不同的,不能给数组整体赋初值。
(4)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。
二、二维数组的定义和引用
1、二维数组的定义
二维数组定义的一般形式为:
类型说明符 数组名[常量表达式][常量表达式];
2、二维数组的引用
二维数组元素的表示形式为:
数组名[下标][下标]
下标可以是整型表达式,如a[2—1][2*2-1]。但不要写成a[2,3]、a[2—1,2*2-1]形式。
数组元素可以出现在表达式中,也可以被赋值。
3、二维数组的初始化
(1)分行给二维数组赋初值。
(2)可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。
(3)可以对部分元素赋初值。
(4)如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第一维的长
度可以不指定,但第二维的长度不能省。
三、字符数组
1、字符数组的定义
用来存放字符数据的数组是字符数组。字符数组中的一个元素存放一个字符。
例如:char c[10];
c[0]='I';c[1]='';c[2]='a';c[3]='m';c[4]='';
c[5]='h';c[6]='a';c[7]='p';c[8]='p';c[9]='y';
以上定义了c为字符数组,包含10个元素。
由于字符型与整型是互相通用的,因此也可以定义一个整型数组,用它存放字符数据,例如:
int c[10];
c[0]='a'; /*合法,但浪费存储空间*/
2、字符数组的初始化
对字符数组初始化,最容易理解的方式是逐个字符赋给数组中各元素。
(1)、如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。
(2)、如果花括号中提供的初值个数(即字符个数)大于数组长度,则按语法错误处理。
(3)、如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动 定为空字符(即'\o′)。
(4)、如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根 据初值个数确定数组长度。
3、字符数组的引用
可以引用字符数组中的一个元素,得到一个字符。
4、字符串和字符串结束标志
在C语言中,是将字符串作为字符数组来处理的。这个字符串的实际长度与数组长度相等。
C语言规定了一个“字符串结束标志”,以字符\o′作为标志。在遇到字符'\o′时,表示字符串结束,由它前面的字符组成字符串。
系统对字符串常量也自动加一个'\o'作为结束符。字符串作为一维数组存放在内存中。
说明:'\o'代表ASCII码为0的字符,从ASCII码表中可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。
5、字符数组的输入输出
字符数组的输入输出可以有两种方法。
(1)逐个字符输入输出。用格式符“%c”输入或输出一个字符。
(2)将整个字符串一次输入或输出。用“%s”格式符,意思是对字符串(string)的输入输出。
注意:
(1)输出字符不包括结束符\0'。
(2)用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。
(3)如果数组长度大于字符串的实际长度,也只输出到遇\o′结束。
(4)如果一个字符数组中包含一个以上'\o′,则遇第一个'\o'时输出就结束。
(5)可以用scanf函数输入一个字符串。
(6)前面介绍的输出字符串的方法:
printf(”%s",c);
实际上是这样执行的:按字符数组名c找到其数组起始地址,然后逐个输出其中的字符,直到遇\o′为止。
6、字符串处理函数
1)、puts函数
其一般形式为: puts(字符数组)
其作用是将一个字符串(以‘\n’结束的字符序列)输出到终端。
2)、gets函数
其一般形式: gets(字符数组)
其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。
3)、strcat函数
其一般形式:
strcat(字符数组1,字符数组2)
strcat是STRing CATenate(字符串连接)的缩写。其作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值——字符数组1的地址。
说明:
(1)字符数组1必须足够大,以便容纳连接后的新字符串。
(2)连接前两个字符串的后面都有\o',连接时将字符串1后面的\o'取消,只在新串最后保留\o'。
4)、strcpy和strncpy函数
其一般形式为:
strcpy(字符数组1,字符串2)
strcpy是STRingCoPY(字符串复制)的简写。它是“字符串复制函数”,作用是将字符串2复制到字符数组1中去。
说明:
(1)字符数组1必须定义得足够大,以便容纳被复制的字符串。字符数组1的长度不应小于字符串2的长度。
(2)“字符数组1”必须写成数组名形式(如str1),“字符串2”可以是字符数组名,也可以是一个字符串常量。
(3)如果在复制前未对str1数组赋值,则str1各字节中的内容是无法预知的,复制时将str2中的字符串和其后的\o′一起复制到字符数组1中,取代字符数组1中的前面6个字符,最后4个字符并不一定是斜杠零,而是str1中原有的最后4个字节的内容。
(4)不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。而只能用strcpy函数将一个字符串复制到另一个字符数组中去。用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。
(5)可以用strncpy函数将字符串2中前面n个字符复制到字符数组1中去。但复制的字符个数n不应多于strl中原有的字符(不包括\o′)。
5)、strcmp函数
其一般形式为:
strcmp(字符串1,字符串2)
strcmp是STRing CoMPare(字符串比较)的缩写。它的作用是比较字符串1和字符串2。
6)、strlen函数
其一般形式为:
strlen(字符数组)
strlen是STRing LENgth(字符串长度)的缩写。它是测试字符串长度的函数。函数的值为字符串中的实际长度(不包括\o′在内)。
7)、strlwr函数
其一般形式:
strlwr(字符串)
strlwr是STRing LoWeRcase(字符串小写)的缩写。函数的作用是将字符串中大写字母换成小写母。
8)、strupr函数
其一般形式为:
strupr(字符串)
strupr是STRing UPpeRcase(字符串大写)的缩写。函数的作用是将字符串中小写字母换成大母。