C 语言(考纲总结):六、数组

3.983k 字  |  14 分钟

6.1 一维数组:定义和初始化、复制、数组参数

6.1.1 一维数组定义格式:

类型说明符 数组名 [常量表达式];

例如:int a[10]; 它表示定义了一个整形数组,数组名为 a,此数组有 10 个元素。

注意:

  1. 数组名定名规则和变量名相同,遵循标识符定名规则。
  2. 在定义数组时,需要指定数组中元素的个数,方括弧中的常量表达式用来表示元素的个数,即数组长度。
  3. 常量表达式中可以包括常量和符号常量,但不能包含变量。也就是说,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 一维数组的初始化

对数组元素初始化的实现方法:

  1. 在定义数组时对数组元素赋以初值。例如:int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  2. 可以只给一部分元素赋值。例如:int a[10] = {0, 1, 2, 3, 4};
  3. 如果想使一个数组中全部元素值为 0,可以写成:int a[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 或者 int a[10] = {0}; 不能写成:int a[10] = {0 * 10};
  4. 在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。例如: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 字符数组的初始化

  1. 对字符数组初始化,可逐个字符赋给数组中各元素。

例如:char c[10] = {'I','a','m','h','h','a','p','p','y'};

  1. 如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符。

例如:char c[10] = {'c','','p','r','o','g','r','a','m'};

  1. 如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。

例如: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 格式符,意思是对字符串的输入输出。

注意:

  1. %s 格式符输出字符串时,printf 函数中的输出项是字符数组名,而不是数组元素名。

  2. 如果数组长度大于字符串实际长度,也只输出到遇 \0 结束。

  3. 输出字符不包括结束符 \0

  4. 如果一个字符数组中包含一个以上 \0,则遇第一个 \0 时输出就结束。

  5. 可以用 scanf 函数输入一个字符串。

  6. 如果利用一个 scanf 函数输入多个字符串,则在输入时以空格分隔。

  7. scanf 函数中的输入项如果字符数组名。不要再加地址符 &,因为在 C 语言中数组名代表该数组的起始地址。错误示范:scanf("%s", &str);

6.3 标准字符串函数

6.3.1 puts 函数

  1. 格式:puts (字符数组)
  2. 作用:将一个字符串(以 \0 结束的字符序列)输出到终端。假如已定义str是一个字符数组名,且该数组已被初始化为 "China"。则执行 puts(str); 其结果是在终端上输出 China。
  3. 用 puts 函数输出的字符串中可以包含转义字符。例如:char str[] = {"China\nBeijing"};

6.3.2 gets 函数

  1. 格式:gets (字符数组)
  2. 从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。如执行下面的函数:gets(str)从键盘输入:Computer↙ 将输入的字符串 "Computer" 送给字符数组 str。

注意:

  1. 函数值为字符数组 str 的起始地址。一般利用 gets 函数的目的是向字符数组输入一个字符串,而不大关心其函数值。

  2. 用 puts 和 gets 函数只能输入或输出一个字符串,不能写成 puts(str1, str2)gets(str1, str2)

6.3.3 strcat 函数

  1. 格式:strcat (字符数组 1, 字符数组 2)

  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 函数

  1. 格式:strcpy(字符数组 1, 字符串 2)

  2. 作用:字符串复制函数,将字符串 2 复制到字符数组 1 中去。

注意:

  1. 字符数组 1 必须定义得足够大,以便容纳被复制的字符串。字符数组 1 的长度不应小于字符串 2 的长度。

  2. "字符数组 1" 必须写成数组名形式(如 str1),"字符串 2" 可以是字符数组名,也可以是一个字符串常量。如 strcpy(str1,"China");

  3. 复制时连同字符串后面的 \0 一起复制到字符数组1中。

  4. 可以用 strcpy 函数将字符串 2 中前面若干个字符复制到字符数组 1 中去。例如:strcpy(str1, str2, 2); 作用是将 str2 中前面 2 个字符复制到 str1 中去,然后再加一个 \0

  5. 不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。如: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 二维数组的初始化

  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} };
  4. 可以对各行中的某一元素赋初值。
    • 例如: int a[3][4] = { {1}, {0,6}, {0,0,11} };
  5. 可以只对某几行元素赋初值。
    • 例如: int a[3][4] = { {1}, {5,6} };
  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};

评论(没有评论)

谢谢你请我喝咖啡~

扫码支持
扫码打赏,支持一下
微信 微信支付
支付宝 支付宝

打开微信扫一扫,即可进行扫码打赏哦