C程序设计(第五版) 第六章 知识总结

数组是一组有序数据的集合,下标表示数据在数组中的序号。
数组中的每一个元素都属于同一个数据类型
C语言中规定用方括号中的数字表示下标,如s[15]表示s15表示第15个学生的成绩。

1.定义和引用一维数组

一维数组元素只要用数组名加一个下标,就能唯一确定。

如何定义一维数组:

一般形式为:类型说明符 数组名[常量表达式]; 例如:int a[10];
注意:
(1)数组命名规则遵循标识符命名规则。
(2)其中常量表达式表示元素的个数,即数组长度。如a[10]表示a数组有10个元素,但是下标是从0开始的。10个元素是a[0],a[1],a[2]...a[9],不存在a[10]
(3)常量表达式包括常量和符号常量,不可用变量,如"a[n];"是错误的!
(4)定义数组后,在内存中划出一片存储空间,如a[10]则相当于定义了10个简单的整型变量。其大小是10x4=40个字节(数组大小*每个元素字节数
(5)划出空间后,数组名代表第一个元素的地址(内存首地址),是地址常量。因此,如果在使用scanf输入函数时,不需要加&符号

如何引用一维数组?

引用数组元素形式:数组名[下标]

注意:
1.只能引用数组元素,而不能一次整体调用整个数组全部元素的值
2.下标可以是整型常量整型表达式

一维数组的初始化

在定义数组的同时给各数组元素赋值,称为数组的初始化。
1.在定义时对全部元素赋初值

int a[10]={0,1,2,3,4,5,6,7,8,9};

2.只给数组中一部分元素赋值

int a[10]={0,1,2,3,4};
此时,只给前5个元素赋值,系统自动给后5个元素赋初值为0。

3.使数组中全部元素值为0,可写成

int a[10]={0}; //系统自动给后面的元素赋初值为0

4.可不指定数组长度

int a[5]={1,2,3,4,5};同等于int a[]={1,2,3,4,5};

注意:

(1)不可在未执行初始化时直接使用元素。例如:

int a[10];
printf("%d",a[1]);

(2)数值数组中,在部分初始化后,凡未被“初始化列表”指定初始化的数组元素,系统会自动初始化为0。(字符数组默认初始化为‘\0’,指针类型默认初始化为NULL,即空指针)

2.定义和引用二维数组

有的数组,元素要指定两个下标才能唯一确定。如2班的第3名学生。二维数组称为矩阵,二维数组写成行(row)和列(column)的排列形式。

定义二维数组

1.二维数组定义的一般形式为:类型说明符 数组名[常量表达式] [常量表达式];
2.如float a3 表示第一维有3个元素,第二维有6个元素。可理解为3行6列的一个矩阵。可以把a看做一个一维数组,有3个元素:a[0],a[1],a[2]。每个元素又是一个包含6个元素的一维数组。
3.二维数组中元素排列顺序按行存放,内存中先放第1行元素,再放第2行....具体见数P147图。
4.上面的例子数组a在内存中一个元素占4字节,前24个字节存序号为0的行中6个元素,下面的24个再存序号1的行中6个元素....

注意:在内存中,各元素是连续存放的,不是二维的。

引用二维数组

引用二维数组形式:数组名[下标][下标]

注意:
1.下标依然是整型或整型表达式
2.在引用数组元素时,下标值应在已定义的数组大小范围内

二维数组的初始化

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}};
作用是只对各行第1列元素赋值,其余元素自动为0。

4.可对各行中某一元素赋初值,如:

int a[3][4]={{1},{0,6},{0,0,11}};

5.可只对某几行元素赋初值:

int a[3][4]={{1},{5,6}};
int a[3][4]={{1},{},{9}};

6.如果对全部元素都赋值时,定义数组时对第1维长度可以说不定,但是第2维长度不能省。如:

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};
系统会根据数据总个数和第2维长度算出第1维长度。

7.定义时也可以只对部分元素赋初值而省略第1维的长度。但要分行赋初值:

int a[][4]={{0,0,3},{},{0,10}}

注意:在未初始化的情况下定义二维数组时,不可以省略任何一维的长度!否则会报错,如:

int a[][4]; X

3.字符数组

C语言中没有字符串类型,也没有字符串变量,字符串是存放在字符型数组中的。

定义字符数组

字符数组中一个元素内存放一个字符。定义方法类似数值型数组。

char a[5];
c[0]='H';c[1]='e';c[2]='l';c[3]='l';c[4]='o';

注:字符数据是以整数形式(ASCII码)存放的,也可用整型数组来存放字符数据

字符数组初始化

(1)把各个字符依次赋给数组中各元素

char a[5]={'H','e','l','l','o'};

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

char[]={'H','e','l','l','o'};

(3)也可以定义和初始化二维字符数组,如:

char p[2][2]={{'a','a'},{'b','b'}}

(4)使用字符串常量来初始化字符数组:

char c[]={"Hello"};同等于char c[]="Hello";

注意:
1.字符数组如果不初始化,数组中各元素值是不可预料的。
2.如果花括号中提供的初值个数(字符个数)大于数组长度,则会报错
3.如果小于数组长度,只将这些字符赋值给数组中前面那些元素,其余的自动补为空字符(\0)

引用字符数组中元素

可以先定义一个字符数组,并用“初始化列表”对其赋初值,然后用循环逐个输出此字符数组中的字符。具体例子见P153

字符串和字符串结束标志

1.C语言中,将字符串作为字符数组来处理,字符串中的字符是逐个存放到数组元素中的。
2.C语言规定了一个“字符串结束标志”,以字符‘\0'作为结束标志。在遇到字符'\0'时,表示字符串的结束,把它前面的字符组成一个字符串
3.程序中,往往依靠检测’\0‘的位置来判定字符串是否结束。

注意:C系统在用字符数组存储字符串常量时会自动加一个’\0‘作为结束符。如:“hello”共5个字符。但由于字符串是存放在一维数组中的,在数组中占6个字节,最后一个’\0‘是系统自动加上的。

例:

char c[]="Hello"; //此时,字符数组c的长度是6,而不是5,因为字符串常量的最后系统会自动加上’\0'。
char c[6]="Hello"; //同等于 char c[6]={'H','e','l','l','o','\0'};

字符数组不要求最后一个字符是‘\0’,可以不包含'\0‘,如:char c[5]={'H','e','l','l','o'};

如果定义了字符数组 char a[]={"Mum comes here."};假如想用新字符串替代原有字符串,则如果从键盘输入“Dad left”,是分别赋值给a数组前8个元素,不过如果不加’\0‘,则会输出:Dad lefts here. 就不对了,所以要在“Dad left“后加‘\0’。则输出Dad left。因为在输出字符数组中的字符串时,遇’\0'就停止输出。

字符数组的输入输出

(1)逐个字符输入输出,用“%c"输入或输出一个字符。
(2)将整个字符串一次输入或输出。用“%s“格式符。

char c[]={"hello"};
printf("%s",c);

输出结果:hello //在内存中最后还有一个'\0'

注意:
1.用“%s”格式符输出字符串时,不可输出数组元素名。
2.数组长度大于字符串实际长度,只输出到'\0'结束。
3.如果一个字符数组中包含一个以上的‘\0’,遇到第一个‘\0’时就输出结束
4.可用scanf函数输入一个字符串:

scanf("%s",c);
输入字符串应短于已定义的字符数组c的长度。如:
char c[6];
输入:hello 系统会自动在hello后加一个‘\0'结束符

5.scanf输入多个字符串,输入时应以空格分隔。

char a[5],b[5],c[5];
scanf("%s%s%s",a,b,c);

输入:How are you? 则将"How","are","you?"这三个字符串分别赋给a,b,c三个数组了。
如果改成:

char a[13];
scanf("%s",a);

依然输入How are you? 则只会将“How”赋给a数组。输出也只会输出How
因为系统把空格字符作为输入的字符串之间的分隔符,输入空格则表示当前字符串输入完毕,末尾自动加上’\0‘。

6.输出字符串的方法执行过程:

printf("%s",c);

字符数组名找到其数组第一个元素的地址,然后逐个输出其中的字符,直到遇到’\0‘为止。
注意:
scanf函数中输入项如果是字符数组名,不要加地址符&。因为C语言中数组名代表该数组第一个元素的地址。

4.字符串处理函数

C函数库提供了一些专门处理字符串的函数。其头部必须包含头文件“string.h”文件

(1)puts函数——输出字符串函数

形式:puts(字符数组)
将一个字符串(以'\0'结束的字符序列)输出到终端。
puts函数输出的字符串中可以包含转义字符。
注:用puts输出时将字符串结束标志‘\0‘转换成’\n‘,即输出完字符串后换行

(2)gets函数——输入字符串函数

形式:gets(字符数组)
作用是从终端输入一个字符串到字符数组,并得到一个函数值。该函数值是字符数组的起始地址。例如:

gets(str);

如果输入hello,送给数组的是6个字符而不是5个,因为最后会把换行符转换成’\0‘,因此需要注意输入字符数应小于字符数组定义的个数。gets函数返回的函数值是字符数组str的第一个元素地址。

注意:
1.puts函数和gets函数只能输出或输入一个字符串,不能写成puts(str1,str2);或gets(str1,str2);
2.在gcc编译器中,可能会出现限制不给使用gets()函数的情况,需要用fgets()函数代替。
3.当一个程序中同时出现scanf函数和gets函数时,务必要注意两个函数的先后顺序,scanf()函数下面最好不要再出现gets()函数,如果不按照顺序,可能会导致输入数据出错。具体问题分析见文档”C语言使用输入字符串函数时的问题

(3)strcat函数——字符串连接函数

形式:strcat(字符数组1,字符数组2)
作用是把两个字符数组中的字符串连接起来,把字符串2接到字符串1后面,结果放在字符数组1中。得到的函数值是字符数组1的地址。

注意:
1.字符数组1必须足够大,以便容纳连接后的新字符串。
2.连接前两个字符串的后面都有'\0',连接时将字符串1后面的'\0’取消,只在新串后面保留'\0'。

(4)strcpy和strncpy函数——字符串复制函数

形式:strcpy(字符数组1,字符串2)
其表示“字符串复制函数”,作用是将字符串2复制到字符数组1中去。例如:

char str1[10],str2[]="China";
strcpy(str1,str2);

注意:

1.字符数组1必须定义足够大,以便容纳被复制的字符串2。字符数组1长度>字符串2
2.“字符数组1”必须是数组名形式。“字符串2”可以是数组名,也可以是一个字符串常量。如:strcpy(str1,"China");
3.复制时将str2中的字符串和其后的'\0'一起复制到字符数组1中,取代字符数组1中的前6个字符(上面例子),最后4个字符不一定是'\0',而是str1中原有的最后4个字节的内容。
4.不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。字符数组名是一个地址常量,不能改变值。如:

char str1[6],str2[6]="Hello";
str1="Hello";×
str1=str2; ×

5.只能用strcpy函数将一个字符串复制到另一个字符数组中。
6.strncpy函数将字符串2中前面n个字符复制到字符数组1中去,如:

strncpy(str1,str2,2);
//将str2中最前面的2个字符复制到str1中,取代str1中原有最前面2个字符。复制字符个数n不该多余str1中原有的字符。

(5)strcmp函数——字符串比较函数

形式:strcmp(字符串1,字符串2)
作用是比较字符串1和字符串2。
比较规则:将两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到'\0'为止
如果全部字符相同,则认为两个字符串相等。
若出现不相同的字符,则以第1对不同的字符的比较结果为准。

比较结果由函数值返回:
1.如果字符串1与字符串2相等,函数值为0
2.字符串1>字符串2,则函数值为一个正整数(具体值由编译器而定)
3.字符串1<字符串2,则函数值为一个负整数(具体值由编译器而定)

注意:
不可用:if(str1>str2);因为str1和str2代表地址,而不代表数组中全部元素

(6)strlen函数——测字符长度函数

形式:strlen(字符数组)
测试字符串长度,函数值为字符串中实际长度(不包括’\0‘)

char str[10]="china";
printf("%d",strlen(str));
输出结果:5

也可直接测试字符串常量:strlen(“china”);

(7)strlwr函数——转换成小写函数

形式:strlwr(字符数组)
将字符串大写字符换成小写字母。

(8)strupr函数——转换成大写函数

形式:strupr(字符数组)
将字符串小写字符换成大写字母。
注意:strlwr和strupr函数都不可以直接转换字符串常量,参数必须是一个字符数组。因为这两个函数是就地修改,也就是直接修改传入指针指向的字符串,所以不能传入字符串常量,因为常量是只读的。

char str[]="China";
strlwr("China"); X
strlwr(str); √
引用请注明出处:http://www.sgyh.xyz/archives/78.html

TAG:none

已有 6 条评论

  1. 案例丰富且贴合主题,论证逻辑环环相扣。

    baviqpgdvh March 4th, 2025 at 06:49 pm回复
  2. 不错不错,我喜欢看

    exniffwbap September 23rd, 2024 at 09:45 am回复
  3. 博主真是太厉害了!!!

    htljblhecl September 22nd, 2024 at 07:15 pm回复
  4. aaa

    tttt April 9th, 2024 at 03:03 pm回复
  5. a

    a December 7th, 2023 at 11:04 am回复
  6. 确实牛!

    cdl August 16th, 2022 at 11:27 am回复

发表新评论