全国计算机等级考试二级C语言考点(完整版) 下载本文

改变各元素的值,这些值是各字符串的首地址)。这样,各字符串的长度可以不同,而且移动指针变量的值(地址)要比移动字符串所花的时间少。

7.2 指向指针的指针

指向指针数据的指针变量,简称为指向指针的指针,通常称为二级指针。定义一个指向指针数据的指针变量的形式: 类型名 * *a;

a前面有两个“*“号,*a是指针变量的定义形式,现在它前面又有一个“*“号,表示指针变量是指向某种类型的指针变量的。

第七章 数组与指针

考点1. 一维数组的定义和引用

1.1 数组的概念

数组是由属于同一个数据类型的有序数据集构成的。数组中的每一个数据称为“元素“。可以用一个统一的数组名和下标来唯一地标识数组中的元素。

1.2 一维数组的定义

一维数组的定义方式为:

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

char c[20];

c是数组名 ,此数组共有20个元素,并且每个元素的类型都为字符型。

1.3 一维数组元素的引用

数组元素的表示形式为: 数组名[下标];

引用数组元素时,数组的下标可以是整型常量,也可以是整型表达式。

和变量一样,数组必须先定义后使用。数组元素只能逐个引用而不能把数组当做一个整体一次引用。

1.4 一维数组的初始化

当数组定义后,系统会为该数组在内存中开辟一串连续的存储单元,但这些存储单元中并没有确定的值。可以在定义数组时为所包含的数组元素赋初值,如: int a[6]={ 0,1,2,3,4,5 };

所赋初值放在一对花括号中,数值类型必须与所说明类型一致。所赋初值之间用逗号隔开,系统将按这些数值的排列顺序,从a[0]元素开始依次给a数组中的元素赋初值。以上语句将a[0]赋值0,a[1]赋值1, …… ,a[5]赋值5。在指定初值时,第一个初值必定赋给下标为0的元素。也就是说数组元素的下标是从0开始的。同时,不可能跳过前面的元素给后面的元素赋初值,但是允许为前面元素赋值为0。当所赋初值个数少于所定义数组的元素个数时,将自动给后面的其他元素补以初值0;当所赋初值个数多于所定义数组的元素个数时,也就是说超出了数组已经定义的范围,在编译时系统将给出出错信息。

C语言规定可以通过赋初值来定义数组的大小,这时一对方括号中可以不指定数组大小。

考点2. 二维数组的定义和引用

2.1 二维数组的定义

在C语言中,二维数组中元素排列的顺序是:按行存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素。因此,二维数组元素的存储与一维数组元素存储相类似,总是占用一块连续的内存单元。 二维数组的一般形式为:

类型说明符 数组名[常量表达式][常量表达式]; 如:int c[3][4];

定义c为3×4 (3行4列)的数组。注意:不能写成c[3,4]。C语言对二维数组采用这样的定义方式:我们可以把二

维数组当做是一种特殊的一维数组。

例如,可以把c看成是一个一维数组,它有3个元素c[0]、c[1]、c[2],每个元素又是一个包含4个元素的一维数组。可以把c[0]、c[1]、c[2]看做是3个一维数组的名字。

2.2 二维数组的引用

二维数组的表示形式为: 数组名[下标][下标]

数组的下标可以是整型表达式,如 c[3-1][3×2-2];。 数组元素可以出现在表达式中,也可以被赋值。 定义数组时用的c[3][4]和引用元素时的c[3][4]的区别:前者用来定义数组的维数和各维的大小,共有3行4列;后者中的3和4是下标值,c[3][4]代表该数组中的一个元素。如果a[3][4]是二维数组中最后一个元素,那么该数组共有4行5列。

2.3 二维数组的初始化

可以在定义二维数组的同时给二维数组的各元素赋初值。 如:

float m[2][2]={{1.5,3.2},{0.8}};

全部初值放在一对花括号中,每一行的初值又分别括在一对花括号中,之间用逗号隔开。当某行一对花括号内的初值个数少于该行中元素的个数时,系统将自动地给后面的元素补初值0。同样,不能跳过每行前面的元素而给后面的元素赋初值。

2.4 通过赋初值定义二维数组的大小

对于一维数组,可以在数组定义语句中省略方括号中的常量表达式,通过所赋初值的个数来确定数组的大小;对于二维数组,只可以省略第一个方括号中的常量表达式,而不能省略第二个方括号中的常量表达式。 如:

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

a数组的第一维方括号中的常量表达式省略,在所赋初值中,含有4个花括号,则第一维的大小由花括号的个数来决定。因此,该数组其实是与a[4][3]等价的。当用以下形式赋初值时: int c[][3]={1,2,3,4,5};

第一维的大小按以下规则决定:

(1)当初值的个数能被第二维的常量表达式的值除尽时,所得商数就是第一维的大小。 (2)当初值的个数不能被第二维的常量表达式的值除尽时,则: 第一维的大小 = 所得商数 + 1 。

因此,按此规则,以上c数组第一维的大小应该是2,也就是说语句等同于 int c[2][3]={1,2,3,4,5};。

考点3. 字符数组

3.1 字符数组的定义

字符数组就是数组中的每个元素都是字符,定义方法同普通数组的定义相同,即逐个对数组元素赋值。如: char c[11];

c为该数组名,该数组共有11个元素,并且每个元素都为字符型。 3.2 字符数组的初始化及引用

对字符数组初始化,可逐个元素地赋值,即把字符逐个赋给数组元素。如: char a[9]={ ′T′, ′h′, ′a′, ′n′, ′k′, ′′, ′y′, ′o′, ′u′};

如果花括号中提供的初值个数(即字符个数)大于数组长度,则按语法错误处理。如果初值个数小于数组长度,则将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(′\\0′)。如: char c[6]={′G′,′o′,′o′,′d′};

数组元素在内存中的存储状态如图6-1所示。

图6-1 数组元素在内存中的存储状态

字符数组的引用形式与其他数组的引用形式相同,采用下标引用,即数组名[下标] 。 例如:

#include main()

{ char c[9]={'T','h','a','n','k','ц','y','o','u'}; int i;

for (i=0; i<9; i++) printf(“%c“,c[i]); }

输出的结果为Thank you。

3.3 字符串和字符串结束标志

C语言中,将字符串作为字符数组来处理。为了测定字符串的实际长度,C语言规定了一个字符串结束标志,以字符'\\0'代表。就是说,在遇到字符'\\0'时,表示字符串结束,由它前面的字符组成字符串。 系统对字符串常量也自动加一个'\\0'作为结束符。 例如:

char c[]=“c program“;

数组c共有9个字符,但在内存中占10个字节,最后一个字节'\\0'是由系统自动加上的。

有了结束标志'\\0'后,在程序中往往依靠检测 '\\0'的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。

说明:'\\0'代表ASCII码为0的字符,是一个“空操作符“,它什么也不干。在输出时也不输出'\\0',它只是一个结束的标志。

3.4 字符数组的输入输出

字符数组的输入输出可以有以下两种方法: (1)用“%c“格式符将字符逐个输入或输出。

(2)用“%s“格式符,将整个字符串一次输入或输出。 例如:

char c[ ]= “program“; printf(“%s“,c);

用格式符“%s“输出字符串时,printf()函数中的输出项应该是数组名,而不是数组中的某个元素,如“printf(“%s“,c[0]);“是不对的,应改为“printf(“%s“,c);“。当数组中的字符串的实际长度小于数组定义的实际长度时,在输出时也是遇到'\\0'就结束;当数组中有多个'\\0'时,遇到第一个'\\0'就结束输出。结束符'\\0'不被输出。在使用scanf()函数中,输入项是字符数组名。输入项为字符数组名时,不用再加取地址符“&“。因为在C语言中数组名代表该数组的起始地址,如“scanf(“%s“,str);“。

第八章 数组与函数

考点1. 一维数组与函数

1.1 一维数组元素作为实参

无论是一维数组元素或者二维数组元素,和普通变量的使用没有任何区别,他们之间仅仅是变量名不同,一维数组元素作为实参传递给形参,形参数据改变不会影响实参变化。

1.2 一维数组元素地址作为实参

一维数组元素的地址作为实参,对应的形参必须是与实参基类型相同的指针变量。此时可以通过被调用函数改变调用函数中的数据。 例 有以下程序段 #include void fun(int x,int *p) {

x*=2;

p[0]=p[-1]+p[1]; }

main() {

int a[10]={1,2,3,4,5,6,7,8,9,10}; fun(a[2],&a[6]);

printf(\ %d\\n\}

程序运行后的输出结果是

A 3 14 B 6 14 C 3 3 D 3 2

解析:答案选A 。本题主函数中有函数调用 fun (a[2],&a[6]);第一个传递的实参是a[2]的值3,第二个传递的实参是&a[6] (a[6]的地址),指针变量p存储a[6]的地址,根据指针变量加下标表示数据的方法,p[0]存储的是a[6]的值,p[-1]存储的是a[5]的值6,p[1]存储的是a[7]的值8。经过p[0]=p[-1]+p[1]计算;值为14。

1.3 一维数组名作为实参

一维数组名为地址常量,表示数组的首地址,如果一维数组名作为实参,对应的形参应该是一个指针变量,此指针变量的基本类型必须与数组的类型一致。 通常被调用函数的首部可以有以下3中方式: (1) fun (int *a) (2) fun(int a[N]) (3)fun (int a[ ]) 例 有以下程序段 #include int fun(int *x,int n) {

int i , sum = 0 ; for (i=0;i

sum=sum+x[i]; return sum; }

main() {

int a[]={1,2,3,4,5 },s=0; s=fun (a,5);

printf(\ \\n\}

程序运行后的输出结果是 A 15 B 25 C 20 D 10

解析:本题main函数中定义了一维数组a,含有5个int类型的数组元素,所以地址常量a的基本类型为int类型,对应的形参x的基本类型也是int类型,可以进行参数的传递,传递后依然用指针变量加下标的方式表示数据。答案A。