考点2 二维数组与函数
二维数组元素作为实参,与普通变量作为实参没有任何区别。
2.1 二维数组名作为实参
二维数组名为行指针常量,如果二维数组名作为实参,对应的形参必须是一个行指针变量。例如:有以下定义和函数调用语句: #define M 5 #define N 3 main() {
int s[M][N]; ……. fun(s); ……. }
此时,实参为二维数组名(即行指针),则fun函数的首部可以是以下3中形式之一: (1) fun ( int (*a)[N]) (2) fun ( int a[ ][N]) (3) fun ( int a[M][N])
注意:行下标可以省略,列下标不可以省略。无论那中饭方式,系统都把a看作一个行指针变量。
2.2 指针数组名作为实参
指针数组名师指向指针的指针常量,因此当指针数组名作为实参时,对应的形参应该为一个指向指针的指针变量。 例如:有以下定义和函数调用语句: #define M 5 #define N 3 main() {
int s[M][N],*p[M]; …….
for(i=0;i 此时,实参为一维数组名(即行指针),则fun函数的首部可以是以下3中形式之一: (2) fun ( int *a[M]) (2) fun ( int *a[ ]) (3) fun ( int **a) 第九章 字符串 考点1. 字符串的概念 简单而言,字符串是若干有效字符的序列,可包含转义字符、ASCⅡ码表中的字符; 形式为: 用双引号括起来的字符序列; 例:\ student.\ , \ \%f\\n\。 字符串的结束标志:‘\\0’。 注:C语言无字符串类型,字符串是存放在字符数组中的。 考点2 . 字符数组的定义与初始化 2.1 字符数组的定义 字符数组:其元素类型为字符类型的数组,其定义与前面介绍的数组定义相同。 例如: char str[40]; 定义一个有40个元素的字符数组,每个元素相当于一个字符变量。 字符型与整形是通用的 2.2 字符数组的初始化 方法:将字符常量以逗号分隔写在花括号中 ①在定义字符数组时进行初始化 char ch[7]={‘s’,’t’,’u’,’d’,’e’,’n’,’t’}; ②在对全部元素指定初值时,可省写数组长度。 char ch[]={‘s’,’t’,’u’,’d’,’e’,’n’,’t’}; ③如果花括弧内提供的初值个数大于数组长度? 2.3 用字符串来直接初始化字符数组 可直接把字符串写在花括号中来初始化字符数组. 如:char ch[9]={“student”}; 系统将双引号括起来的字符依次赋给字符数组的各个元 素, 并自动在末尾补上字符串结束标志字符'\\0'。 几点说明: (1)字符串结束标志'\\0'仅用于判断字符串是否结束,输出字符串时不会输出。 (2)在对有确定大小的字符数组用字符串初始化时,数组长度应大于字符串长度。如: char s[7]={\是错误的. (3)在初始化一个一维字符数组时,可以省略花括号。 如: char s[8]=\ ( 4 )不能直接将字符串赋值给字符数组名。下面的操作是错误的。 如: s=”student”; 考点3. 字符串的输出方法 3.1 用printf函数 用printf输出字符串时,要用格式符“%s”,输出时从数组的第一个字符开始逐个字符输出,直到遇到第一个‘\\0’为止。 例: char st[15]=“I am a boy!” printf(“st=%s,%c,%c”,st,st[3],st[7]); 输出结果:st=I am a boy!mb 3.2 用puts函数输出字符串 函数原型:int puts(char * str); 调用格式:puts(str); 函数功能:将字符数组str中包含的字符串或str所指示的字符串输出,同时将'\\0'转换成换行符。 例:char ch[]=\ puts(ch); puts(\ 将字符数组中包含的字符串输出,然后再输出一个换行符。因此,用puts()输出一行,不必另加换行符'\\n'。 函数puts每次只能输出一个字符串,而printf可以输出几个:printf(\ 考点4. 字符串的输入 (1)使用scanf函数输入字符串 例:char st[15]; scanf(“%s”,st); 但:scanf(“%s”,&st);是错误的,因为st就代表了该字符数组的首地址。 注:输入时,以回车或空格作为结束标志; 即:用scanf输入的字符串中不能含有空格。 若按如下方法输入: How do you do?↙ 执行语句 : scanf(\ ; 则s 的内容为: How\\0 使用格式字符串\时会自动加上结束标志'\\0'。第一个空格后的字符没有输入st中。 (2)使用函数gets()输入字符 函数原型:char *gets(char *str); 调用格式: gets(str); str是一个字符数组或指针。 函数功能:从键盘读入一个字符串到str中,并自动在末尾加字符串结束标志符’\\0’。 输入字符串时以回车结束输入,这种方式可以读入含空格符的字符串 如: char s[14]; gets(s); 若输入的字符串为: How do you do?↙ 则s 的内容为: How do you do?\\0 例:字符串输入输出示例 #include {char s[20],s1[20]; scanf(“%s”,s); printf(“%s\\n”,s); scanf(“%s%s”,s,s1); printf(“s=%s,s1=%s”,s,s1); puts(“\\n”); gets(s); puts(s); } 程序运行过程: How do you do?↙ How How do you do?↙ s=How,s1=do How do you do?↙ How do you do? 注意: 1.输出字符不包括‘\\0’. 2.用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是元素数组名。 3.如果数组长度大于字符串实际长度,他只输出到遇到‘\\0’结束。Char c[10]={“china”}; printf (“%s\\n”,c);输出china 4.如果一个字符数组中包含两个以上‘\\0’,则遇到第一个 时就结束输出。 5.scanf中写字符数组名,不要再加地址符。 第 十 章 结构体与共用体 考点1. 用typedef说明一种新类型 用typedef说明一种新类型名 C语言可以用typedef说明一种新类型名,说明新类型名的语句一般形式为: typedef 类型名 标识符; 其中,“类型名“一定是在此语句之前已有定义的类型标识符。“标识符“是一个用户定义标识符,用来标识新的类型名。typedef语句的作用仅仅是用“标识符“来代表已存在的“类型名“,并没有产生新的数据类型,因此,原有的类型名依然有效。 声明一个新的类型名的具体步骤如下: (1)先按定义变量的方法写出定义的主体(如float a;)。 (2)将变量名换成新类型名(如将a换成FLO)。 (3)在最左面加上关键字typedef(如 typedef float FLO;)。 (4)然后可以用新类型名去定义其他的变量(如 FLO b;)。 考点2. 结构体数据类型 结构体类型 在实际工作中,当我们需要把一些不同类型,但相互之间又存在着联系的信息组合应用时,就要用到结构体。结构体是一种看似复杂但却非常灵活的构造型数据类型。在通常情况下,一个结构体类型由若干个称为成员(或称为域)的部分组成。不同的结构体类型可根据需要由不同的成员组成。但对于某个具体的结构体类型,其成员的数量必须固定,这一点与数组相同;但该结构体中各个成员的类型可以不同,这是结构体与数组的重要区别。例如,我们常用的“时间“可以由以下3个部分描述:小时(hour)、分(minute)、秒(second)。它们都可以用整型数表示,可以把这3个成员组成一个整体,并给它取名为time,这就是一个简单的结构体。 声明一个结构体类型的一般形式为: struct 结构体名 { 成员表列 }; struct是C语言中的关键字,是结构体类型的标志。“结构体名“用做结构体类型的标志,它又称“结构体标记“(structure tag)。大括弧内是该结构体中的各个成员,成员表列是由若干个变量类型名及变量名组成的。这些成员共同组成一个结构体。例如,上面提到的“时间“结构体类型可以说明如下: struct time { int hour; int minute; int second; }; 其中,time就是结构体名, hour、minute、second都是成员,并且各成员都应进行类型声明,每个成员也就是结构体中的一个域。成员名命名规则与变量名相同。所以结构体类型也可以用以下形式说明: struct 结构体标识名 { 类型名1 结构体成员名表1; 类型名2 结构体成员名表2; …… 类型名n 结构体成员名表n; }; 说明: (1)“结构体标识名”和“结构体成员名表”都必须是合法的用户定义的标识符。 (2)每个“结构体成员名表“中都可以含有多个同类型的成员名,它们之间以逗号分隔。