6.1 一维数组:定义和初始化、复制、数组参数
6.1.1 一维数组定义格式:
类型说明符 数组名 [常量表达式];
例如:int a[10];
它表示定义了一个整形数组,数组名为 a,此数组有 10 个元素。
注意:
- 数组名定名规则和变量名相同,遵循标识符定名规则。
- 在定义数组时,需要指定数组中元素的个数,方括弧中的常量表达式用来表示元素的个数,即数组长度。
- 常量表达式中可以包括常量和符号常量,但不能包含变量。也就是说,C 语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。
6.1.2 一维数组在内存中的存放
float mark[100];
- 每个数据元素占用的字节数,就是基类型的字节数。一个元素占 4 字节。
6.1.3 数组元素的引用方式
数组名 [下标]
:下标可以是整型常量或整型表达式。例如:a[0] = a[5] + a[7] - a[2 * 3];
注意:
定义数组时用到的 "数组名[常量表达式]" 和引用数组元素时用到的 "数组名[下标]" 是有区别的。
例如:int a[10];
、t = a[6];
6.1.4 一维数组的初始化
对数组元素初始化的实现方法:
- 在定义数组时对数组元素赋以初值。例如:
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
- 可以只给一部分元素赋值。例如:
int a[10] = {0, 1, 2, 3, 4};
- 如果想使一个数组中全部元素值为 0,可以写成:
int a[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
或者int a[10] = {0};
不能写成:int a[10] = {0 * 10};
- 在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。例如:
int a[5] = {1, 2, 3, 4, 5};
也可以写成int a[] = {1, 2, 3, 4, 5};
或者int a[10] = {1, 2, 3, 4, 5};
只初始化前 5 个元素,后 5 个元素为 0。
6.2 字符串和字符数组
6.2.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';
6.2.2 字符数组的初始化
- 对字符数组初始化,可逐个字符赋给数组中各元素。
例如:char c[10] = {'I','a','m','h','h','a','p','p','y'};
- 如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符。
例如:char c[10] = {'c','','p','r','o','g','r','a','m'};
- 如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。
例如:char c[] = {'I','a','m','h','h','a','p','p','y'};
数组 c 的长度自动定为 10。
6.2.3 定义和初始化一个二维字符数组
char diamond [5][5] = {{' ',' ','·'}, {' ','·',' ','·'}, {'·',' ',' ',' ','·'}, {' ','·',' ','·'}, {' ',' ','·'}};
6.2.4 字符串和字符串结束标志
为了测定字符串的实际长度,C 语言规定了一个“字符串结束标志 \0
。字符数组并不要求它的最后一个字符为 \0
,甚至可以不包含 \0
。
但是由于系统对字符串常量自动加一个 \0
。因此,为了使处理方法一致,在字符数组中也常人为地加上一个 \0
。
6.2.5 字符数组的输入输出
-
逐个字符输入输出。用格式符
%c
输入或输出一个字符。 -
将整个字符串一次输入或输出。用
%s
格式符,意思是对字符串的输入输出。
注意:
用
%s
格式符输出字符串时,printf 函数中的输出项是字符数组名,而不是数组元素名。如果数组长度大于字符串实际长度,也只输出到遇
\0
结束。输出字符不包括结束符
\0
。如果一个字符数组中包含一个以上
\0
,则遇第一个\0
时输出就结束。可以用 scanf 函数输入一个字符串。
如果利用一个 scanf 函数输入多个字符串,则在输入时以空格分隔。
scanf 函数中的输入项如果字符数组名。不要再加地址符 &,因为在 C 语言中数组名代表该数组的起始地址。错误示范:
scanf("%s", &str);
6.3 标准字符串函数
6.3.1 puts 函数
- 格式:
puts (字符数组)
- 作用:将一个字符串(以
\0
结束的字符序列)输出到终端。假如已定义str是一个字符数组名,且该数组已被初始化为 "China"。则执行puts(str);
其结果是在终端上输出 China。 - 用 puts 函数输出的字符串中可以包含转义字符。例如:
char str[] = {"China\nBeijing"};
6.3.2 gets 函数
- 格式:
gets (字符数组)
- 从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。如执行下面的函数:
gets(str)
从键盘输入:Computer↙
将输入的字符串 "Computer" 送给字符数组 str。
注意:
函数值为字符数组 str 的起始地址。一般利用 gets 函数的目的是向字符数组输入一个字符串,而不大关心其函数值。
用 puts 和 gets 函数只能输入或输出一个字符串,不能写成
puts(str1, str2)
或gets(str1, str2)
6.3.3 strcat 函数
-
格式:
strcat (字符数组 1, 字符数组 2)
-
作用:连接两个字符数组中的字符串,把字符串 2 接到字符串 1 的后面,结果放在字符数组 1 中,函数调用后得到一个函数值——字符数组 1 的地址。
例如:
char str1[30] = {"People′s Republic of "};
char str2[] = {"China"};
print("%s",strcat(str1, str2));
// 输出:People′s Republic of China
6.3.4 strcpy 函数
-
格式:
strcpy(字符数组 1, 字符串 2)
-
作用:字符串复制函数,将字符串 2 复制到字符数组 1 中去。
注意:
字符数组 1 必须定义得足够大,以便容纳被复制的字符串。字符数组 1 的长度不应小于字符串 2 的长度。
"字符数组 1" 必须写成数组名形式(如 str1),"字符串 2" 可以是字符数组名,也可以是一个字符串常量。如
strcpy(str1,"China");
复制时连同字符串后面的
\0
一起复制到字符数组1中。可以用 strcpy 函数将字符串 2 中前面若干个字符复制到字符数组 1 中去。例如:
strcpy(str1, str2, 2);
作用是将 str2 中前面 2 个字符复制到 str1 中去,然后再加一个\0
。不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。如:
str1 = "China";
不合法,str1 = str2;
不合法。
用 strcpy 函数只能将一个字符串复制到另一个字符数组中去。
用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。
6.3.5 strcmp 函数
- 格式:
strcmp(字符串 1, 字符串 2)
- 作用:比较字符串 1 和字符串 2。返回比较结果。
- 如果字符串 1 == 字符串 2,函数值为 0。
- 如果字符串 1 > 字符串 2,函数值为一正整数。
- 如果字符串 1 < 字符串 2,函数值为一负整数。
6.3.6 strlen 函数
- 格式:
strlen(字符数组)
- 作用:测试字符串长度的函数。函数的值为字符串中的实际长度(不包括
\0
在内)。
6.3.7 strlwr 函数
- 格式:
strlwr(字符串)
- 作用:将字符串中大写字母换成小写字母。
6.3.8 strupr 函数
- 格式:
strupr(字符串)
- 作用:将字符串中小写字母换成大写字母。
6.4 二维数组:定义、引用、访问、数组参数
6.4.1 二维数组定义格式
类型说明符 数组名[常量表达式][常量表达式]
例如:定义 a 为 3 * 4
(3 行 4 列)的数组,b 为 5 * 10
(5 行 10 列)的数组。如下:float a[3][4], b[5][10];
不能写成:float a[3,4], b[5,10];
注意:
我们可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。
例如:可以把 a 看作是一个一维数组,它有 3 个元素:a[0]、a[1]、a[2],每个元素又是一个包含 4 个元素的一维数组。
6.4.2 二维数组在内存中的存放
二维数组中的元素在内存中的排列顺序是:按行存放,即先顺序存放第一行的元素,再存放第二行的元素 ……
例如:整型数组 b[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
在内存中的位置。
6.4.3 二维数组元素的引用方式
二维数组元素的表示形式为: 数组名 [下标][下标]
,例如 a[2][3]
。
下标可以是整数表达式,如 a[2-1][2*2-1]
。不要写成 a[2, 3]
、a[2-1, 2*2-1]
形式。
注意:在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。
6.4.4 二维数组的初始化
- 分行给二维数组赋初值。
- 例如:
int a[3][4] = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} };
。
- 例如:
- 可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。
- 例如:
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
。
- 例如:
- 可以对部分元素赋初值。
- 例如:
int a[3][4] = { {1}, {5}, {9} };
。
- 例如:
- 可以对各行中的某一元素赋初值。
- 例如:
int a[3][4] = { {1}, {0,6}, {0,0,11} };
。
- 例如:
- 可以只对某几行元素赋初值。
- 例如:
int a[3][4] = { {1}, {5,6} };
。
- 例如:
- 如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。
- 例如:
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
等价于int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
。
- 例如:
评论(没有评论)