【高级语言程序设计】第 5 章:数组

目录

一、数组

(1)一维数组

① 一维数组的定义 

② 一维数组的格式 

③ 一维数组元素的引用

④ 一维数组的初始化

(2)二维数组

① 二维数组的定义

② 二维数组的格式

③ 二维数组元素的引用

④ 二维数组的初始化

二、字符数组

(1)一维字符数组

① 一维字符数组的定义

② 一维字符数组的格式

③ 一维字符数组的初始化

④ 一维字符数组的输入和输出

(2)二维字符数组

① 二维字符数组的定义

② 二维字符数组的格式

③ 二维字符数组的初始化

④ 二维字符数组的输入和输出

三、字符串

(1)字符串的定义

(2)字符串的赋值方法

(3)字符串的输入和输出

① 字符串输入函数 gets()

② 字符串输出函数 puts()

③ 字符串比较函数 strcmp()

④ 字符串复制函数 strcpy()

⑤ 字符串连接函数 strcat()

⑥ 测字符串长度函数 strlen()(其中 len 是 length 的缩写)

⑦ 字符串大写字母转换成小写函数 strlwr()

⑧ 字符串小写字母转换成大写函数 strupr()



一、数组

数组:是具有 相同数据类型 的一组 有序数据 的集合。
数组元素:数组中的数据称为数组元素,数组元素通过数组名和下标引用,下标是数组元素在数组中的位置序号,表示该数组元素在数组中的相对位置。

(1)一维数组

① 一维数组的定义 

一维数组的定义:
  • 数组同变量一样,必须先定义后使用。
  • 数组占用内存单元,在定义数组时必须指定数组元素的数据类型和数组元素的个数,这样才能为其分配相应的内存单元。

② 一维数组的格式 

一维数组是只有一个下标的数组,其定义的一般形式:

  • 数据类型符 数组名1[长度1],数组名2[长度2],…;
  1. “数据类型符” 是指数组元素的数据类型。数据类型可以是任何基本类型。
  2. “数组名” 与变量名一样,必须遵循标识符的命名规则。
  3.  “长度” 必须是整型的常量表达式,必须用一对方括号括起来,表示数组的元素个数(又称数组长度),可由整型常量或符号常量组成,但其中不能出现变量。需要注意的是,在数组定义时“长度”外面的一对方括号,以及数组元素引用时 “下标表达式” 外面的一对方括号,都是 C 语言语法规则要求的。
  4. 数组元素的下标是元素相对于数组首地址或起始地址的偏移量,所以从 0 开始顺序号。
  5. 数组名表示整个数组所占用的内存空间的首地址。同一数组中的所有元素,按其下标的顺序占用若干连续的存储单元。
  6. 一个数组定义语句中可以只定义一个数组,也可以定义多个数组,还可以同时定义数组和变量。

③ 一维数组元素的引用

引用一维数组中任意一个元素的方法:
  • 数组名[下标]
  1.  “下标” 可以是一个整型常量、整型变量或整型表达式,其取值范围是 0~(长度-1)。需要注意的是,在 C 程序运行过程中,系统并不自动检查数组元素的下标是否越界,即下标可以不在 0~(长度-1)的合法范围内。
  2. 任何一个数组元素,本质上就是一个变量,它具有和相同类型单个变量一样的属性,可以被赋值,可以接收键盘输入的数据,也可以组成表达式。如果数组元素参与表达式运算,则必须已被赋值。


④ 一维数组的初始化

一维数组的初始化:数组元素和变量一样,可以在定义时对数组元素赋初值,称为数组的初始化。

一维数组初始化的一般格式:
  • 数据类型符 数组名[长度]={初值表},…;
  1. 如果对数组的全部元素赋初值,定义时数组长度可以省略(系统根据初值个数自动确定);如果被定义数组的长度,与初值个数不同,则数组长度不能省略。
  2.  “初值表” 中初值个数、可以少于数组元素的个数,即允许只给部分元素赋初值。若只对数组的前若干个元素赋初值,则没有给出初值的元素均有默认的初值。对于数值型数组默认的初值为0;对于字符型数组,默认的初值为空字符 “‘\0’” (ASCII 码值为 0 )。
具体地,一维数组的初始化可以分为以下几种情况:

① 给一维数组的全部元素赋初值。

  • 例如:设 int a[4]={1,2,3,4};
② 给一维数组的部分元素赋初值。
  • 例如:设 int a[4]={1,2};
③ 初值的个数不能超过一维数组元素的个数。
  • 例如:int a[4]={1,2,3,4,5};
  • 一维数组 a 的长度是 4 ,而初值的个数是 5 ,初值的个数超出了数组长度,则编译时系统会报错。
④ 给一维数组的全部元素赋初值时允许省略数组长度的说明。
  • 例如:int a[4]={1,2,3,4};
  • 则可以写成:int a[]={1,2,3,4};
需要注意的是,只能给数组元素赋值,不能给数组名赋值,因为数组名代表数组的首地址,数组名是常量。


(2)二维数组

① 二维数组的定义

二维数组的定义:二维数组也需要先定义后使用


② 二维数组的格式

二维数组的定义形式:
  • 数据类型符 数组名[行长度][列长度],…;
  1. 数据类型可以是任何基本类型。
  2. 数组名和变量名一样,必须遵循标识符的命名规则。
  3. 行长度说明二维数组有几行,列长度说明二维数组有几列。行长度和列长度都是一个 “整型常量表达式” ,表达式中不能出现变量。
  4. 二维数组的元素个数 = 行长度 * 列长度
  5. 二维数组元素在内存中的排列顺序是 “按行存放” ,即先顺序存放第一行的各个元素,再存放第二行的各个元素,依此类推。
  6. 可以把二维数组看作是一种特殊的一维数组,其每个元素都是一个一维数组。
  7. 一个数组定义语句中可以只定义一个二维数组,也可以定义多个二维数组;可以在一条定义语句中同时定义一维和二维数组,同时还可以定义变量。


③ 二维数组元素的引用

二维数组元素的引用:定义了二维数组后,就可以引用该数组的任意元素。

二维数组元素的引用方法:
  • 数组名[行下标][列下标]
  1. “行下标” 和 “列下标” 可以是整型常量、整型变量、整型表达式或符号常量。
  2. “行下标” 和 “列下标” 均从 0 开始,都应在已定义数组大小的范围内,不能越界。行下标的合法取值范围是 0 ~(长度-1),列下标的合法取值范围是 0 ~(长度-1)。
  3. 与一维数组元素的引用方法相同,任何一个二维数组元素均可以看作一个变量,它具有和同类型单个变量一样的属性,可以被赋值,可以接收键盘输入的数据,也可以组成表达式。如果二维数组元素参与表达式运算,则必须已被赋值。

④ 二维数组的初始化

二维数组的初始化分为以下几种情况:
① 按行给二维数组的全部元素赋初值,其一般形式:
  • 数据类型符 数组名[行长度][列长度]={ {第0行初值表},{第1行初值表},…,{最后一行初值表}};
② 按二维数组在内存中的排列顺序给各元素赋初值,即不分行给二维数组的全部元素赋初值,其一般形式:
  • 数据类型符 数组名[行长度][列长度]={初值表};
③ 只对每行的前若干个元素赋初值,此时所有未赋初值的二维数组二维数组元素均为 0 值(即对于整型二维数组是 0 ,对于实型二维数组是 0.0 ,对于字符型二维数组是 ‘\0’ )。
④ 只对前若干行的前若干个元素赋初值,此时所有未赋初值的的数组元素均为0
值。
⑤ 如果对全部元素都赋初值,则 “行长度” 可以省略。需要注意的是只能省略 “行长度” ,但第二维的长度即 “列长度” 不能省略。使用这种方式赋初值,允许给出的初值不是列长度的整数倍。此时,行长度=初值个数整除列长度后加1。
⑥ 如果分行给所有行的前若干个元素赋初值,则行长度可以省略。

 

 



二、字符数组

(1)一维字符数组

一维字符数组的定义

字符数组的定义:一维字符数组,用于存储和处理一个字符串,其定义格式与一维数值型数组一样。

② 一维字符数组的格式

一维字符数组的定义形式:
  • char 数组名[数组长度]={初值表};
其功能是定义一维字符型数组,并为其赋初值。

③ 一维字符数组的初始化

一维字符数组的初始化分为以下几种情况:
❶ 用字符初始化字符数组
  • 例如:char str1[8]={‘p’ , ‘r’ , ‘o’ , ‘g’ , ‘r’ , ‘a’ , ‘m’ , ‘\0’};
  • 例如:char str2[5]={‘C’ , ‘h’ , ‘i’ , ‘n’ , ‘a’};
❷ 用字符串初始化字符数组
  • 例如:char str1[8]={“program”}
  • 字符串是用双引号括起来的一串字符。在字符串末尾系统会自动地添加一个字符串结束标志符 ‘\0’ ,表示字符串在此位置结束。字符 ‘\0’ 的 ASCⅡ 码值为 0 ,称为空字符,它不作为字符串的有效标志,只起到标志结束的作用,但需要占用 1 字节的内存空间。
❸  用字符的 ASCⅡ 码值初始化字符数组
  • 例如:char str1[8]={112,114,111,103,114,97,109,0};

❹ 初始化时如果只提供了部分元素的值。未提供初值的元素自动赋值为 ‘\0’ 。

  • 例如:char str1[10]={“program”}

④ 一维字符数组的输入和输出

❶ 使用 scanf() 和 printf() 函数

  • 逐个字符输入和输出:在 scanf() 函数或 printf() 函数中用 “%c” 格式说明符每次输入或输出一个字符,重复该过程完成整个字符串的输入和输出。
  • 将字符串整个输入和输出:在 scanf() 函数或 printf() 函数中用 “%s” 格式说明符一次性输入或输出整个字符串。

❷ 使用 gets() 和 puts() 函数

  • 使用字符串输入函数 gets() 或字符串输出函数 puts() 将字符串整个输入或输出。


(2)二维字符数组

① 二维字符数组的定义

二维字符数组的定义:二维字符数组用于同时存储和处理多个字符串,其定义格式与二维数值型数组一样。


② 二维字符数组的格式

二维字符数组定义形式:
  • char 数组名[行长度][列长度]={ {初值表},{初值表},…,{初值表}};
其功能是定义二维字符型数组,并为其赋初值

③ 二维字符数组的初始化

二维字符数组的初始化分为以下几种情况:

❶ 用字符初始化二维字符数组

  • 例如:char s[2][10] ={ { ‘c’ , ‘o’ , ‘m’ , ‘p’ , ‘u’ , ‘t’ , ‘e’ , ‘r’}, {‘s’ , ‘c’ , ‘i’ , ‘e’ , ‘n’ , ‘c’ , ‘e’}};
❷ 用字符串初始化二维字符数组
  • 例如:char s[2][10]={“computer” , “science”};
  • 二维字符数组在初始化时,未提供初值的元素自动赋值为 ‘\0’ 。


④ 二维字符数组的输入和输出

❶ 二维字符数组的输入:

  • 对于二维字符数组,除了可以使用初始化的方法赋值外,还可以从键盘赋值。
  • 二维字符数组的每一行可以看作一个一维字符数组,可以将二维字符数组的每一行作为一个一维字符数组进行输入和输出。

❷ 二维字符数组的输出:

  • 二维字符数组的输出一般有三种方式:



三、字符串

(1)字符串的定义

字符串的定义:字符串是指若干有效字符的序列,可以包括字母、数字、专用字符和转义

字符等。

(2)字符串的赋值方法

❶ 第一种方式是按单个字符的方式赋初值,其必须有一个是字符串的结束标志符 ‘\0’;
❷ 第二种方式是直接在初值表中给出一个字符串常量。
  • 需要注意的是,由于系统在存储字符串常量时,会在字符串末尾自动加上一个结束标志符 ‘\0’ ,所以无需认为添加。
  • 另外,由于字符串结束标志符 ‘\0’ 也需要在字符数组中占用一个元素的存储空间,即 1 字节,因此在说明字符数组长度时,至少为字符串所需长度加 1 。

(3)字符串的输入和输出

❶ 使用函数 scanf() 和 printf():
  • 逐个字符的输入和输出:在 scanf() 或 printf() 函数中使用 “%c” 格式说明符每次输入或输出一个字符,重复执行多次完成整个字符串的输入或输出。
  • 字符串的整体输入和输出:在 scanf() 或 printf() 函数中使用 “%s” 格式说明符一次性输入或输出整个字符串。

    说明:

  1. scanf() 函数或 printf() 函数中,与 “%s” 格式说明符对应的输入项或输出项应是地址。
  2. 使用 “%s” 格式说明符输入字符串时,系统会自动在字符串末尾加一个 ‘\0’ ,将字符串连同添加的 ‘\0’ 一起存入字符数组中。
  3. 使用 “%s” 格式说明符输入字符串时,遇到空格或回车则认为字符串输入结束。
  4. 使用 “%s” 格式说明符输出字符串时,一旦遇到 ‘\0’则结束输出 ( ‘\0’ 不输出),其后字符不在输出。

❷ 使用函数 gets() 和 puts():

  • 使用字符串输出函数 gets() 或字符串输入函数 puts() 将字符串整体输入或输出。

① 字符串输入函数 gets()

【调用格式】gets(字符数组名)

【参数】字符数组名是已经定义的字符数组名。
【功能】从标准输入设备即键盘上输入一个字符串(可以包含空格,仅以回车作为结束标志),并将其存储到指定的字符数组中。
【返回值】字符数组的首地址。
【说明】
  1. gets() 函数输入的字符串的长度没有限制,编程者应保证字符数组有足够大的空间,存放输入的字符串。
  2. gets() 函数和使用 “%s” 格式说明符的 scanf() 函数都可以从键盘输入字符串,但两者是有区别的。对于 scanf() 函数,回车和空格符都看成是输入字符串的结束标志;对于 gets() 函数输入字符串中允许包含空格,只有回车才看作是输入字符串的结束标志。


② 字符串输出函数 puts()

【调用格式】 puts()
【参数】字符数组名是已经存放字符串的字符数组名。
【功能】把字符数组名中所存放的字符串,输出到标准输出设备即显示器,并以 ‘\n’ 取代字符串的结束标志 ‘\0’ 。所以用 puts() 函数输出字符串时,不要求另外加换行符。
【返回值】无。
【说明】
  1. 字符串中允许包含转义字符,输出时产生一个控制操作。
  2. puts() 函数和使用 “%s” 格式说明符的 printf() 函数都可以输出字符串,但两者是有区别的。对于 printf() 函数,不输出字符串结束标志符;对于 puts() 函数,字符串结束标志符 ‘\0’ 转换为 ‘\n’ 输出。此外,puts() 函数一次只能输出一个字符串,而 printf() 函数用来输出字符串时一次可以输出多个。


③ 字符串比较函数 strcmp()

【调用格式】strcmp(字符串1,字符串2)

【参数】“字符串1” 和 “字符串2” 可以是字符串常量,也可以是已经存放字符串的字符数组名。
【功能】比较两个字符串的大小,即两个字符串从左到右逐个字符进行比较(按照 ASCⅡ 码值的大小进行比较),直到出现不同字符或遇到 ‘\0’ 为止。
  • 如果 “字符串1” 等于 “字符串2” ,则函数返回值为 0。
  • 如果 “字符串1” 大于 “字符串2” ,则函数返回值是正整数(大于 0 的整数)。
  • 如果 “字符串1” 小于 “字符串2” ,则函数返回值是负整数(小于 0 的整数)。
【说明】
  1. 如果一个字符串是另一个字符串从头开始的子串,则母串为大。
  2. 不能使用关系运算符 “ == ” 比较两个字符串,只能调用 strcmp() 函数进行处理。


④ 字符串复制函数 strcpy()

【调用格式】 strcpy(字符数组名,字符串[,整型表达式])
【参数】
  • “字符数组名” 是已经定义的字符数组名。
  • “字符串” 可以是字符串常量,也可以是已经存放字符串的字符数组名。
  • “整型表达式” 可以是任何整型表达式,这一参数可以省略。
【功能】将 “字符串” 的前 “整型表达式” 个字符组成新的字符串复制到 “字符数组” 中,若省略 “整型表达式” ,则将 “字符串” 完整地复制到 “字符数组中” ,字符数组的原有内容被覆盖。
【返回值】字符数组的首地址
【说明】
  1. 字符数组长度必须足够大,以便容纳复制过来的字符串。复制时,连同字符串结束标志 ‘\0’ 一起复制。
  2. 不能用赋值运算符 “ = ” 将一个字符串直接赋值给一个字符数组,只能调用 strcpy() 函数处理。


⑤ 字符串连接函数 strcat()

【调用格式】 strcat(字符数组名,字符串)
【参数】
  • “字符数组名” 是已经定义的存放字符串的字符数组名。
  • “字符串” 可以是字符串常量,也可以是已经存放字符串的字符数组名。
【功能】把 “字符串” 连接到 “字符数组” 中字符串的尾端(最后一个有效字符的后面),组成新的字符串并存储到 “字符数组” 。 “字符数组” 中原来的结束标志,被 “字符串” 的第一个字符覆盖,而 “字符串” 在操作中未被修改。
【返回值】字符数组的首地址。
【说明】
  1. 由于没有边界检查,编程者应注意保证字符数组长度足够大,以便容纳连接后的新字符串;否则,会因长度不够出现问题。
  2. 连接前两个字符串都有结束标志 ‘\0’ ,连接后字符数组中存储的字符串结束标志 ‘\0’ 被舍弃,只在新字符串的最后保留一个 ‘\0’ 。


⑥ 测字符串长度函数 strlen()(其中 len 是 length 的缩写)

【调用格式】 strlen(字符串)
【参数】“字符串” 可以是字符串常量,也可以是已经存放字符串的字符数组名。
【功能】测字符串(字符串常量或字符数组)的实际长度(不包含字符串结束标志符 ‘\0’)。
【返回值】字符串的实际长度。

 

 


⑦ 字符串大写字母转换成小写函数 strlwr()

【调用格式】 strlwr(字符串)
【参数】“字符串” 可以是字符串常量,也可以是已经存放字符串的字符数组名。
【功能】将字符串中的大写字母转换成小写字母,其他字符(包括小写字母和非字母字符)不转换。

⑧ 字符串小写字母转换成大写函数 strupr()

【调用格式】 strupr(字符串)
【参数】“字符串” 可以是字符串常量,也可以是已经存放字符串的字符数组名。
【功能】将字符串中的小写字母转换成大写字母,其他字符(包括大写字母和非字母字符)不转换。 

猜你喜欢

转载自blog.csdn.net/qq_39720249/article/details/129917398
今日推荐