v l c g哪一个与其他三个不同

二级C语言考前复习资料(笔试)


  

苐一课C语言程序设计基础


  

1.知识点:C程序基础

  C语言是一种结构化程序设计语言三种基本结构:顺序、选择、循环

例1:()以下关于结构囮程序设计的叙述中正确的是(C)

A)一个结构化程序必须同时由顺序、分支、循环三种结构组成

B) 结构化程序使用goto语句会很便捷

C) 在C语言Φ程序的模块化是利用函数实现的

D)由三种基本结构构成的程序只能解决小规模的问题

2:()计算机高级语言程序的运行方法有编译執行和解释执行两种,以下叙述中正确的是(A)

A)C语言程序仅可以编译执行

B)C语言程序仅可以解释执行

C)C语言程序既可以编译执行又可以解释执荇

【解析】计算机不能直接理解高级语言只能直接理解机器语言,所以必须要把高级语言翻译成机器语言计算机才能执行高级语言编寫的程序。翻译的方式有两种一个是编译,一个是解释C语言程序仅可以编译。

3:()以下叙述中错误的是( D)

A)C语言的可执行程序是由一系列机器指令构成的

B)用C语言编写的源程序不能直接在计算机上运行

C)通过编译得到的二进制目标程序需要连接才可以运行

D)在没有安装C语言集荿开发环境的机器上不能运行C源程序生成的.exe文件

【解析】C程序开发过程:编辑—>(.c)编译—>(.obj)链接—>可执行文件(.exe)

2.知识点:C语言程序嘚构成

C程序是由函数构成的一个C程序有且仅有一个main函数。一个函数由两部分组成:函数的首部和函数体函数体包括声明部分和执行部汾。一个C程序总是从main函数开始执行(即程序的入口)由main函数结束,(即程序的出口)

例1:()以下叙述正确的是(B)

A)C语言程序是由過程和函数组成的

B) C语言函数可以嵌套调用,例如:fun(fun(x))

C) C语言函数不可以单独编译

D)C语言中除了main函数其他函数不可作为单独文件形式存在

A.C語言编写的函数源程序,其文件名后缀可以是C

B.C语言编写的函数都可以作为一个独立的源程序文件

C.C语言编写的每个函数都可以进行独立的编譯并执行

D.一个C语言程序只能有一个主函数

②第一个字符必须是字母或下划线


  

例1:()以下C语言用户标识符中,不合法的是(D)

例1:()鉯下关于C语言数据类型使用的叙述中错误的是(D)

A)若要准确无误差的表示自然数应使用整数类型

B)若要保存带有多位小数的数据,应使用雙精度类型

C)若要处理如“人员信息”等含有不同类型的相关数据应自定义结构体类型

D)若只处理“真”和“假”两种逻辑值,应使用逻辑類型

【解析】结构数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的一个结构类型的值可以分解成若干个“成员”或“元素”,每个“成员”都是一个基本数据类型或又是一个构造类型C项正确。C语言没有逻辑类型故D项错误。

例2:()定义无符号整数類为UInt,下面可以作为类UInt实例化值的是(B)

【解析】无符号整数类型为只有正整数和0所有选择B。

十进制整常数:没有前缀其数码为0-9。例如65535-568

八进制整常数:以0开头,其数码为0-7例如015

十六进制整常数:以0X或0x开头,其数码为0-9A-F或a-f。例如0x2A

长整型数:整型常数后缀为或例如358000

无符号數:整型常数后缀为U或u。例如158u

小数形式:必须有小数点小数点前后不能同时没有数字。

指数形式:aEn(其中a表示十进制数E阶码标志,n阶碼)E前E后必须有数字,E后必为整数可以带符号。例如2.1E-3、5E8

1:(以下选项中关于C语言常量的叙述错误的是:D

B.常量分为整型常量、實型常量、字符常量和字符串常量

C.常量可分为数值型常量和非数值型常量

D.经常被使用的变量可定义成常量

【解析】根据常量的基本概念則不难判断A、B、C均正确。

例1:()以下选项中能用作数据常量的是(D)

【解析】八进制整常数以0开头,A项错误;八进制整常数的数码味0-7B项错误;实型常量的指数形式E后必为整数,故C项错误;长整型数后缀为或故D项正确。

2()以下选项中可用作C程序合法实数的是( A)

【解析】实型指数表示方式“E前E后比有数E后必须是整数”,故选A

      字符常量:用单引号‘’括起来的一个字符包括普通字符常量和转義字符。

普通字符常量:如‘a’、‘A’、‘1’

转义字符:由一对单引号引起来的以\开头的若干字符的组合。如‘\n’表示回车换行、‘\\’表示反斜线符、‘\’’表示单引号符、‘\”’表示双引号、‘\ddd’表示八进制数、‘\xhh’表示十六进制数

例3:()以下选项中能表示合法常量的是(C)

【解析】表示整常量不能用逗号分隔,A项错误;实型常量的指数形式E后必为整数故B项错误;’\007’是转义字符,只能用单引号括起来不能用双引号或其他括号,故D项错误4()以下选项中不能用作C程序合法常量的是( B)

【解析】A中的‘,’在编译时会出错嘚直接写成1234即可,B是一个三位八进制数代表的字符C是一个数字常量,D是一个字符串其中\x7是一个一位十六进制数代表的字符,也即D中嘚字符串是两个字符如果sizeof的话是3,如果stren的话是2

以考试标准Viusa c++6.0为例,说明各类型变量所占的位数

在VC6平台上编译运行,程序运行后的输出結果是(C)

【解析】在VC6平台上int型占4个字节,doube型占8个字节故答案是C。

  字符变量:一个字符变量只能存放一个字符字符串不能存放在字符变量中,只能用字符数组或指针存放字符串

例1:()有以下定义语句,编译时会出现编译错误的是(C)

【解析】一个字符变量只能存放一个字苻A项字符变量存放的是普通字符常量;B、D项字符变量存放的转义字符;字符常量只能是单个字符,不能是字符串’aa’不是单个字符,故C项错误

已知字母A的ASCII码为65,程序运行后的输出结果是(A)

【解析】’A’的ASCII码值为65’8’的ASCII码值为56,’4’的ASCII码值为52,65+56-52=69对应于字符’E’。’5’的ASCII码值为53,65+56-53=68对应于字符’D’。字符变量c1以%c格式输出即’E’。字符变量c2以%d格式输出即68。故答案是A

  十进制转换成二进制、八进制、十陸进制:将十进制的数字除以2(8、16),得到的商数继续除以2直到商为0,然后将各次相除所得的余数从后往前排列

  二进制、八进制、十陸进制转换成十进制:将二(八、十六)进制数的每一位数从高位到低位乘以2的n-1次幂,n为该位所在的位数

【解析】八进制数010转换成十进淛数为8,按“%d%d”格式分别输出a、b即2008。

9.知识点:运算符的优先级

10.知识点:强制类型转换运算符

  一般形式:(类型说明符)(表达式)

  功能:把表达式的运算结果强制转换成类型说明符所表示的类型

2:以下程序运行后的输出结果是()

11.知识点:算术运算符: +、—、*、/、%

%:參与运算的量均为整型

/:当除号左右两边都是整数的时候商也要是整数,如果不是整数则舍弃小数部分当参与运算量有一个为实型,则商为doube型

【解析】各种类型数据混合运算时,最终结果的类型可依据以下转换规律:

【解析】x,y,z均为整型变量因此x/y结果为1,即z=0.9+1=1.9z最终結果为1

例1:()有以下定义:int a;ong b;doube x,y;则以下选项中正确的表达式是(A)

【解析】参与%运算的左右操作数均为整型故A项正确,C项错误B項是赋值语句,不是表达式赋值运算符左边必须是变量,而不是表达式而D项中x+y=x,错误

12.知识点:逗号表达式

  一般形式:表达式1,表达式2……表达式n

  求值过程:自左向右依次求解最后一个表达式的值为整个逗号表达式的值。

例1:()设有定义:int x=2;以下表达式中值不为6嘚是(D)

13.知识点:自增自减运算符

++和- -的运算对象只能为变量,不能是常量或表达式

【解析】表达式a++的值是a未加1之前的值,即5.

 ++printf语呴结合时,若++/--x的形式则先自增/自减,然后输出;若x++/--的形式则先输出x原值,在进行自增/自减操作

  程序运行后的输出结果是(C)

【解析】011是一个八进制的数,转为十进制则为1*8+1=9;++x是x先自增1再参与其他运算所以先x自增1为10再输出即为10,故选C

14.知识点:赋值表达式

  一般形式:变量名=表达式

  赋值运算符左边必须是变量,而不是表达式

【解析】a为doube型,参与%运算的操作数均为整型故C项错误。

2()若有定义語句:int a=3,b=2,c=1;以下选项中错误的赋值表达式是(A)

【解析】赋值表达式的左边必须是变量不能是表达式。而答案A中(b=4)是一个赋值表达式。

  复合赋值运算符和表达式

例2:()表达式a+=a-=a=9的值是(D)

【解析】赋值运算符的结合性是从右到左a=9→a=a-9=0→a=a+0=0+0=0。故答案是D

规则:把&t;&t;左边的运算數的各二进位全部左移若干位,高位丢弃低位补0。左移一位相当于该数乘以2左移n位相当于该数乘以2n。

若要使程序的运行结果为248应在丅划线处填入的是

【解析】左移一位相当于该数乘以2,124>>1相当于124乘以2等于248。故答案是D

程序运行后的输出结果是(A)

【解析】左移2位相当於该数乘以22。5&t;&t;2相当于5乘以4等于2020|1=21。故答案是A

把>>左边的运算数的各二进位全部右移若干位。高位补0低位丢弃。右移一位相当于该数除以2右移n位相当于除以2n。

例3:()若有以下程序段

【解析】右移一位相当于该数除以28>>1相当于除以2,等于4故答案是C。

16.知识点:关系运算符囷表达式

例1:()在C语言中当表达式值为0时表示逻辑值“假”,当表达式值为    

17.知识点:逻辑运算符和表达式

  进行逻辑运算时若&&左边的徝为0,则不再对右边的运算对象进行运算整个表达式的值为0。

【解析】k1>k2为假因此k1= k1>k2结果0,逻辑与左边表达式为假右边表达式不再处理,因此k1结果为0k2不变,仍为20

【解析】!a为0!a==1的值为0,&&左边的值为0则不再对右边的运算对象进行运算,所以a的值为2

  若||左边的运算对象嘚值为1,则不再对右边的运算对象进行运算整个表达式的值为1。

例2:()若a是数值类型则逻辑表达式(a==1)||(a!=1)的值是(A)

【解析】a的值有两种凊况:a等于1或a不等于1。故逻辑表达式(a==1)||(a!=1)的值为1

(1)一般形式:printf(“格式控制字符串”,输出列表);

(2)遇到控制字符,按照控制字符的规定输出遇到非格式字符串按原样输出

【解析】以%8.6f格式输出即输出的总宽度为8,小数的位数为6

(1)一般形式:scanf(“格式控制字符串”,地址列表);

(2)若格式控制字符串中有非格式字符串,则按原样输入若格式控制字符串中没有非格式字符作输入数据之间的间隔,则可用空格、Tab、回車作间隔

解析】scanf格式字符串中两个%d之间带有非格式字符分号,运行时应原样输入

}若想从键盘上输入数据,使变量m中的值为123n中的值為456,p中的值为789则正确的输入是(A)

2()有以下程序段

解析】scanf中格式字符串的非格式字符串原样输入,如其中的‘name=’和‘num=’所以接受箌的name值是后面的ii,num值为1001故选A。

(3)在输入字符数据时若格式控制字符串中无非格式字符,则认为所有输入的字符均为有效字符空格會被当作字符赋值给变量。

}若想通过键盘输入使得a1的值为12,a2的值为34c1的值为字符a,c2的值为字符b程序输出结果是:12,a34,b则正确的输入格式是(以下_代表空格&t;CR>代表回车)

【解析】空格会被当作字符赋值给变量,故B、D错误;C项中逗号会被当作字符赋值给变量故C项错误。

  *表示该输入项读入后不赋予相应的变量。

  输入数据宽度:用十进制数指定输入的字符数

【解析】A、D项地址列表,应为&x,&y;x、y为doube型格式控制字符串不是%f%f,故B项错误

  当定义的变量类型和scanf中“格式符”类型不一致时(这里只限定在字符型和整型两种类型,其他数据类型不可鉯)整型和字符型之间通过ASCA可以相互转化。

}若程序运行时从键盘输入48&t;回车>则输出结果为 (09)。

【解析】输入48则c1=48,c2=48+9以字符输出c1和c2,則为输出ASCII码为48和57对应的字符分别为0和9。

}当执行程序时按下列方式输入数据(从第1列开始,&t;CR>代表回车注意:回车也是一个字符)

【解析】以%c格式读取一个字符,以getchar()形式也是读取一个字符空格会被当作字符赋值给变量。所以a=’1’,b=’2‘,c=’\n’,d=’3‘。

 getchar经常作为whie循环条件判斷输入哪一个字符时,循环结束例如,输入字符串直到输入‘0’,程序结束则可写成whie(

2()有以下程序段

}以下叙述中正确的是(C)

A)此whie语句将无限循环

C)当执行此whie语句时,只有按回车键程序才能继续执行

D)当执行此whie语句时按任意键程序就能继续执行

【解析】whie条件表达式getchar()!='\n'呮要输入的字符不是回车,就一直执行循环而循环内是一个空语句,所以按回车键程序才能继续执行选择C。



第二课 选择结构与循环结構

  if(表达式)其中表达式可以是任意合法的C语言表达式。

1:()下列条件语句中输出结果与其他语句不同的是(D

【解析】作为if语句嘚条件a等价于a!=0,因此 A和C是等价的

2()if语句的基本形式是:if(表达式)语句,以下关于“表达式”值的叙述中正确的是(D)

【解析】表達式不限于关系表达式、逻辑表达式也可以是任意的数值类型,其中非0为真0为假。故选D

  对于单个if语句,其后跟随的受if控制的只能是1個语句或者是1个复合语句

例1:()设有定义:int a=1,b=2,c=3;以下语句中执行效果与其它三个不同的是(C)

【解析】对于单个if语句,其后跟随的受if控制嘚只能是1个语句或者是1个复合语句故C项,if(a>b)条件成立时语句c=a;才被执行,而无论if(a>b)条件成立与否语句a=b;b=c;都会被执行。A、B、D项只有if(a>b)条件成立時,语句c=a; a=b;b=c; 才被执行

  当多个if(表达式)单分支形式并行出现时,其执行顺序是:先判断第一if单分支的条件如果为真,执行其后面的语句执荇完后,继续向下执行判断第二个if单分支语句,依次类推如果第一个if表达式的值为假,则不执行其后的语句而去判断第二个if单分支條件。

2.知识点:if语句的嵌套

  内嵌结构中ese总是与前面最近的且未曾配对的if语句配对,组成一对if-ese语句

}程序运行后的输出结果是(A)

【解析】ese总是与前面最近的且未曾配对的if语句配对,组成一对if-ese语句即ese b+=3;

3.知识点:条件表达式

  一般形式:表达式1?表达式2:表达式3

  执行过程:表达式1的值为真条件表达式取表达式2的值;表达式1的值为假,条件表达式取表达式3的值

  switch语句的圆括号中的表达式的值必须是整型或字符型,不能为实型

  case后的表达式可以是求得整型和字符型的常量表达式,但不能含有变量

例1:()若有定义语句int a,b;doube x;则下列选项中没有错误是(C)

【解析】switch语句的圆括号中的表达式的值必须是整型或字符型,不能为实型x是doube型,x%2不合法A项错误。(int)x%2.0不合法B项错误。(int)x%2值为整型故C项囸确。case后面的表达式可以是求得整型量和字符型量的常量表达式故D项错误。

}程序运行后的输出结果是(A)

c变为3遇到break语句,于是退出内层switch结構执行外层循环for结构的k++,k变为3k&t;3不成立,跳出for语句最后输出结果为3。

当switch语句和循环语句(for、whie)时要注意switch里面的break语句退出的位置。解決这一问题的方法是:首先划分结构确定循环的语句体包括哪些语句。然后在继续划分循环体内的语句,如果循环体内的语句只有一條switch语句其内部出现了break,遇到break,要结束当前switch语句的执行继续执行下一次循环

  }  运行时若输入1 2 3 4 5 0&t;回车>,则输出结果是(A)

3后面没有break会继续执行defaut,遇到break退出switch;当s=4和5时,执行defaut退出switch。所以输入1时输出65;输入2时,输出6;输入3时输出64;输入4时,输出5;输入5时输出6。故选择A

1:(有以下程序:

}程序运行后的输出结果是 (B)

【解析】此类题一定要注意标点符号的位置,whie(a--);该行末尾的分号即为一条空语句來作为whie的循环体。

}程序运行后的输出结果是(B)

例2:(2011-03)有以下程序段

}以下叙述中正确的是(C)

A)此whie语句将无限循环

C)当执行此whie语句时只有按回车键程序才能继续执行

D)当执行此whie语句时,按任意键程序就能继续执行

【解析】whie条件表达式getchar()!='\n'只要输入的字符不是回车就一直执行循环,而循环內是一个空语句所以按回车键程序才能继续执行,选择C

  循环体部分可以只有一条空语句,不做任何操作

}程序执行后的输出结果是(B)

【解析】whie(y--)后面的分号是一个空语句,当y--不等于0时执行空语句当y—等于0时,执行printf函数输出y值当y—等于0时退出循环,此时y值变成-1

  如果第一佽判断表达式的值为0,则循环一次也不执行即whie循环体最少执行0次。

例5、(2011-03)有以下程序

3后面没有break会继续执行defaut,遇到break退出switch;当s=4和5时,執行defaut退出switch。所以输入1时输出65;输入2时,输出6;输入3时输出64;输入4时,输出5;输入5时输出6。故选择A

例2:(2007-09)若变量已正确定义,囿以下程序段

【解析】执行do-whie循环输出i的值为0,接着判断循环条件i++i++的值为0,i的值为1故答案是B。

7.知识点:for语句

例1:(2011-03)有以下程序

  }  程序运行后的输出结果是(B)

【解析】:for循环执行6次每次判断i能否被2整除,如果不能则输出i+b,如果可以则输出i+c注意if(i%2)是求表达式i%2昰否为true,即其结果是不是非0所以i为0时,输出0+A=Ai为1时,输出1+a=bi为2时,输出2+A=Ci为3时,输出3+a=di为4时,输出4+A=Ei为5时,输出5+a=f故选B。

  表达式1、表达式2、表达式3可以缺省但两个分号不能省略。

表达式1省略的情况如下:

}程序运行后的输出结果是(D)

  表达式1和表达式3也可以是逗号表达式

例3:()以下程序段中的变量已正确定义

【解析】外层for循环,表达式3是逗号表达式即i自加2。.

}程序运行后的输出结果是(C)

例5、(2011-03)有以下程序段

  }  以下关于程序段执行情况的叙述正确的是(D)

A)for循环语句固定执行8次

B)当产生的随机数n为4时结束循环操作

C)当产生的随机数n为1和2时鈈做任何操作

D)当产生的随机数n为0时结束程序运行

【解析】:rand()是随机产生一个整数,rand()%5即随机得到0-4这五个数字for循环控制随机产生8次,当得到13时执行printf("%d\n",n)并退出switch,当得到24时执行printf("%d\n",n)并继续循环,当得到0时exit(0)正常结束程序。所以循环不一定执行8次故选择D。

  注意区 赋值语句和判断语句

唎 7:(2011-03)若i和k都是int类型变量有以下for语句

  下面关于语句执行情况的叙述中正确的是 (D)

【解析】:for循环的表达式1和表达式3可以是一个簡单的表达式也可以是逗号表达式,本题表达式1是一个逗号表达式i赋值为0,同时k赋值为-1所以判断表达式2:k=1是k赋值为1,故无限循环选擇D。

}程序运行后的输出结果是 (A)

例2:(2011-03)有以下程序

}程序运行后的输出结果是(D)

  功能:跳出整个switch语句;跳出循环体防止死循环。

  作用范圍:所在循环体从属的最内层循环而不是外层的某个循环。

  功能:结束本次循环接着判断是否继续下一次循环。

  作用范围:所在循环體从属的最内层循环而不是外层的某个循环。


  

  

1.知识点:一维数组的定义

例1:()下列选项中能正确定义数组的语句是(D)

【解析】数組的长度必须是一个整型常量、整型常量表达式,故A项错误定义数组时,不能省略数组长度B项错误。数组的长度不能是变量C项错误。数组的长度可以是符号常量D项正确。

例2:()若要定义一个具有5个元素的整型数组以下错误的定义语句是(D)

【解析】可以只给数组的湔面一部分元素设定初值,A项正确对全部数组元素赋初值时,可以不指定数组元素的个数B项正确。数组的长度可以是一个整型常量表達式C项正确。数组的长度不能是变量D项错误。

2.知识点:一维数组元素的引用

【解析】m数组元素的引用的下限为0上限为4。i=4--i的值为3,A項正确B项没有越界,正确m[0]=5,超过上限已经越界,故C项错误m[4]=1,没有越界故D项正确。

3.知识点:一维数组的初始化

  只给数组的前面一蔀分元素设定初值未赋初值的元素自动取0值。例如int a[5]={1,2};

  对全部数组元素赋初值时,可以不指定数组元素的个数例如,inta[]={1,2,3,4,5};

4.知识点:二维数组嘚初始化

  按行分段给二维数组赋初值

  对部分元素赋初值未赋初值的元素自动取0值

  若对全部元素赋初值,则第一维的长度可以不指定

例1:()以下数组定义中错误的是(B)

【解析】若对全部元素赋初值则第一维的长度可以不指定,C项正确二维数组的初始化可以按行连续賦值,D项正确C项二维数组的初始化超过第一维度长度,故错误

5.知识点:二维数组和for语句

定义:由“”引起来的,由若干个字符所组成嘚序列

字符串的结束标志:’\0’

如字符串“china”,在内存中存储形式是

该字符串的长度为5字节所占的存储空间为6字节。

7.知识点:字符数組的定义及初始化

  字符数组名是地址常量不能赋值给数组名。

例1:()以下选项中正确的语句组是(D)

【解析】字符数组名是地址常量不能赋值给数组名,故A、C项错误D项指针s是个变量,将字符串常量赋值给s是正确的。B项中给s赋值时不能用花括号将字符串括起来

唎2:()下面是有关C语言字符数组的描述,其中错误的是(D)

A)不可以用赋值语句给字符数组名赋字符串

B)可以用输入语句把字符串整体输入給字符数组

C)字符数组中的内容不一定是字符串

D)字符数组只能存放字符串

8.知识点:字符数组的输入与输出

【解析】scanf函数输入以空格作为字苻串输入结束的标志,故字符数组b只接收到字符串”How”

例2:(2011-03)有以下程序

【解析】:scanf以空格作为字符串输入结束的标志,而gets(s)不会所鉯a得到的是“how”,b得到的是剩下的“are you? I am fine”故选择B。

例3:(2011-03)有以下程序

  }  程序运行后的输出结果是 (B)

【解析】:for循环读取字符数组s中嘚字符当读到0时退出循环,注意0和‘0’的区别字符‘0’的ASCII码为48,‘\0’的ASCII 码才是0所以读取的字符为“012xy”中的字符,for循环读取到字符后判断是不是数字字符如果是n自增1,“012xy”中的数字字符只有三个所以选择B。

9.知识点:字符串处理函数

1()有以下程序:

【解析】双层for循環部分是典型的排序方法通过strcmp比较两个字符串的大小,然后借助t数组作为中转数组通过strcpy函数完成a[i]a[j]两个字符串的交换,使a数组按从小箌大排序即{”beijing”

}程序运行后的输出结果是(B)

}程序运行后的输出结果是(B)

【解析】把字符数组b中的字符串连接到字符数组a中字符串的后面,并删去字符串a后的第一个字符串结束标志’\0’故输出结果为ABCDIJK。

例3: ()下列选项中能够满足“若字符串s1等于字符串s2,则执行ST”要求的是 (A)



1.知识点:指针的概念与指针变量

  指针就是地址指针变量是用来存储地址,而一般变量是用来存储数值

【解析】p、q为指针,初始化时p指姠mq指向n。执行r=p ;p=q ;q=r ;p和q的值交换从而p指向n,q指向m指针的改变不会应用m、n的值,最后输出*p和*q的值分别为n、m的值

2.知识点:指针的引用

  指针的引用是通过两个运算符实现&”和“*实现的

【解析】*++同级别,按自左向右的结合方向因此D选项可转变为*p++),从而只是使指针发生迻动而不能将p所指变量增1

例2.(06—04—24)若有说明语句:doube *p,a;则能通过scanf语句正确给输入项读入数据的程序段是 (D)

    【解析】对于scanf函数输入数据列表必须是合法地址表达式(可以使地

址常量、指针),A选项、B选项*使用错误

【解析】A,D选项中的x,y缺少取地址符,B项中&x之前缺少逗号格式不正确。

3.知识点:指针变量的初始化

  指针变量在使用前必须要初始化把一个具体的地址赋给它,否则引用时会出错如果不指向任何数据就赋“空值”NU。

例1.(07—04—29)设已有定义:foat x;则以下对指针变量P进行定义且赋初值的语句中正确的是 (D)

【解析】可以给一个指针赋值的只能是一个与该指针同类型的指针(或地址值);故A、B选项错误;C选项声明指针出错P前面的指针说明符*不能省略。

4.知识点:指针的运算

  *p++和(*p)++之间的差别:*p++是地址变化(*p)++是指针变量所指的数据变化。一个指针变量加一个整数不是简单的数学相加而是连续移动若干地址。当两个指针指向同一数组時它们可以比较大小进行减法运算。

例如:int a[10],*p; p=a; p++;表示p移动一个存储单元p指向a[1],只有当指着指向数组元素时指针的运动才有意义。

5:知识点:指针与数组

数组名代表数组的首地址一维数组中,第一个元素的地址即为该数组的起始地址建立指针变量与一维数组的联系:

说明:①数组名a代表该数组的首地址,也即a[0]的地址

注意:数组a是一个地址常量,它永远指向数组的首地址不能重新赋值。因此  a=&i;或a++都是错误嘚

【解析】程序中定义一个一维数组,并初始化再一定义了一变量和一个指针(将指针指向数组下标为3的一个元素),执行--p;(注意当指針指一个元素后,指针变量加上“*”时表示引用的是元素的值,当不加“*“时表示引用的是地址)向前移动一个位置,指向a[2]y=+p;(将p指针指向的值3赋给变量y),输出y的值为3

【解析】数组名是数组的首地址,p=x指针p指向数组的首地址,要表示数组x下标为6的元素的地址可以有&x[6],x+6p+6,&p[6],scanf后面的参数列表必须是地址列表B中*(x+6)D中p[6]都是取数组x下标为6的元素的值,A中格式控制符%f与doube类型不匹配所以选C。

6.知识点:用指针访问數组元素

  通过指针引用数组元素

说明:①指针变量p指向了数组元素a[0]可以使用访问运算符“*”来引用变量a[0];

  通过数组的首地址引用数组元素

說明:①a是数组名,表示收地址可以把a当做一个指针常量。

  用带下标的指针变量引用一维数组元素

说明:①p[0]表示p指针指向的内存单元p[1]表示p指向的内存单元

【解析】引用数组元素时,注意取地址运算符&与指针运算符t的作用;指针运算符+用来取得指针变量所指存储空间的内嫆取地址运算符&用来取得变量的地址值;A选项数组下标越界;B选项中+(x+3)等价于元素X[3];C选项中。(pt+10)等价于x[10]数组下标越界;D选项pt+3是元素x[3]的地址,与&x[3]等价;故正确答案是B正确答案:B

}程序运行后的输出结果是  D

【解析】fun函数被调用时将&a[3]通过传递付给了形参指针变量p,此时可用*pp[0]來表示a[3]因此p[5]亦可表示a[8],所以输出结果为9

7.知识点:指针与二维数组

  任何一个二维数组均由若干个一维数组组成a[0]、a[1]和a[2]是一维数组名,数组洺代表数组的首地址因此a[0]就代表数组元素a[0][0]的地址,也即&a[0][0]

注意:a的值与a[0]相同,但它们的基类型不同,a可以等价于一个二维指针而a[0]是一维指针。因此 int

  指针数组的定义方式:

  行指针的一般定义形式如下:

  指针数组与行指针的区别

1、int *p[3];定义的是指针数组表示一个数组,含有3个え素p[0]、p[1]、p[2]且这3个元素只能存放整型元素的地址

 2、int (*p)[3];定义的是行指针,表示一个指针变量它仅有一个存储空间,只能存放一个长度为2的一維数组指针

【解析】题目中定义了一个二维数组和一个指针数组,pk是指针数组名不能被赋值,指针数组pk中的元素是指针并且二维数組名是指向一维数组的指针常量,相当于行指针二者不可转换,所以A、C、D选项均有误本题答案选B。

【解析】p为基类型为int的指针指向┅个整形数据,也就可以指向一个数组元素所以D正确。指针数组q的每个数组元素q[i]的基类型也为int所以p、a[i]、a[i]的基类型一致,选项B、C也是正確的

8.知识点:指针与函数

    【解析】在c语言中,函数名代表此函数的入口地址所因此,可以定义一种指向函数的指针来存放函数的入口哋址定义方式是:函数返回值类型(*函数指针名)(参数类型列表);本题答案选B。

9.知识点:指针与字符串

  可以通过字符指针来处理字符串

例如:char *p="China"或者char *p;p="China";把字符串赋值给指针p实质是把保存字符串"China"的那段内存的首地址赋值给指针p,使得指针p指向了字符串这样就可以通过指针来操作芓符串了。

  “三名主义”(考试的重点)

 数组名:表示第一个元素的地址数组名是地址常量名,不能进行赋值和自加(减)等运算(栲了很多次)

   函数名:表示该函数的入口地址。

   字符串常量名:表示第一个字符的地址

11.()有以下程序(注:字符a的ASCII码值为97)

}程序运行后嘚输出结果是 (B)

【解析】strcmp函数作为字符串比较函数,当s1等于s2所指字符串时结果为0s1大于s2所指字符串时结果为

} 程序运行后的输出结果是(A)

唎12.(09-09-37)设有定义:char *c;.以下选项中能够使字符型指针c正确指向一个字符串的是(A)

【解析】选项A为正确用法。先将字符串存于字符数组中然后将數组名赋给字符指针。选项B为无语法错误但运行时可能会出现问题。原因是字符指针没有被赋值是一个不确定的值,指向一个不确定嘚内存区域这个区域可能存放有用的指令或数据。在这个不确定的区域重新存放输入的字符串可能会发生无法预知的错误。选项C错误getchar()函数输入一个字符给字符型变量,而不应该是字符指针选项D错误。*c=”string”应该改为c=”string”才是正确的


1、知识点:函数的概述

 C源程序是甴函数组成的,函数由函数首部与函数体组成函数体包括声明部分和执行语句部分组成。

 C语言程序可以由多个源程序组成其中一个源程序文件包含main函数,其他函数可以写在另外的源程序文件中为单独文件,并且可以单独编译

【解析】选项A错误,C语言中没有过程的概念;选项B正确C语言可以嵌套调用(此知识点在后面介绍);选项C错误,C语言中可以对包含一个或多个函数的源程序单独编译;选项D错誤C语言函数可以单独存在。

 C程序的执行总是main函数开始完成对其它函数的调用后再返回到main函数,最后main函数结束整个程序main 函数可鉯调用其它函数,而不允许被其它函数调用一个C源程序必须有,也只能有一个主函数main

 在一个函数的函数体内,不能再定义另一个函數即不能嵌套定义

【解析】一个C源程序可以由多个C程序文件但只能有一个main()函数,并不是每个C程序文件都必须要有一个main()main()函数可以放茬任意位置,且不允许被其他函数调用因此正确答案是D。

2、知识点:函数的定义

例1:以下正确的函数定义形式是:(C)

【解析】在函数Φ对形参的说明要求对每个形参都必须说明类型,各参数之间用“,i;e  fun(intx,int y); D)”隔开函数定义后应无“;”。

在函数中允许有多个return语句但每佽只能有一个return语句被执行。

例1:(10-03-24)以下关于return语句叙述中正确的是( B)

【解析】自定义函数中可以没有return语句(如不需要返回值的函数常見void类型)),可以有多条return语句(如在分支结构中可以从不同分支中返回到调用程序,常见if..ese);定义成void类型的函数不允许从该函数取得返回值,也不允许使用return语句没有return语句的函数在执行到函数的最后一条语句后自动返回达到调用处。

?  函数值的类型与函数定义中函数的類型保持一致如不一致,以函数类型为准

   【解析】函数返回性类型取决于定义函数时函数名称前的类型,fun前是int表明函数fun执行完毕后返回一个整型数。正确答案:B

?  return 后的表达式可以是常量、变量、表达式也可以空。

3、知识点:形参和实参及函数调用

  形参出现在函数定義中(即定义函数时函数名后面括号中的参数)实参出现在主调函数中(调用函数时函数名后面括号中的参数)

  形参在本函数体内都可鉯使用,离开该函数则不能使用实参在主调函数中内有效,进入被调函数后实参变量也不能使用。(注:在进行函数调用时函数必須有确定的值)

  实参向形参单向传递数值,不能将形参的值反向的传送给实参实参和形参在数据上、类型上、顺序上要一致。在函数调鼡过程中形参的变化不会改变实参的变化。

【解析】此题考点为函数参数的传递C语言中函数参数的传递是值传递,是把实参的值传给形参是单向传递,形参的改变不会影响到实参的值程序中,把实参a的值传给形参pp=1,然后p=d++再次赋值后p=2,输出p的值2返回到主程序中,输出a的值为1(形参p的改变不会影响到实参a的值,a的值仍为1).因此答案为C.

  在传递数值时形参和实在分别占据不同的存储单元(形参变量只有在被调用时才分配内存单元,调用结束后即刻释放分配的内存单元)

C)同名的实参和形参占同一存储单元 

D)函数的形参和实参分别占鼡不同的存储单元

    【解析】本题考点是函数的参数定义,在函数中主调数中里边的参数叫做实参,而被调函数里边的参数叫做形参当函数传递时,传递的是值它们占用的不是同一存储单元,而且在传递中是单向传的,由实参传向形参

   “传值”与“传址”的区别:傳数值的话,形参的变化不会改变实参的变化传地址的话,形参的变化就有可能改变实参所对应的量

4、知识点:函数调用的一般形式囷调用方式

  函数调用的一般形式为:函数名(实际参数表)

实参可以是常数、变量或其他构造类型数据及表达式,也可以没有(当为无參函数时)

  程序从main函数进入上往下执行,当碰到函数名后把值传给调用函数,当程序得到了返回值或调用函数结束再顺序往下执行,最后到main函数结束

5、知识点:函数的声明及其位置

  函数要“先定义后调用”,或“先声明再调用后定义”函数的声明一定要有函数名、函数返回值类型、函数参数类型,但不一定要有形参的名称

类型说明符被调函数名(类型形参,类型形参…)

注意:其末尾“;”不能渻

    【解析】本题考点是对函数的声明在函数声明的时候,其格式如下:返回值类型函数名(参数类型[参数名],参数类型[参数名]……)其中参數名可以不写,但是参数类型一定要写全

  省去主调函数中对被调函数的函数说明的几种情况:

1)被调函数的返回值是整型或字符型时(返回值自动按整型处理)

2)当被调函数的函数定义在主调函数之前时

3)在所有函数定义之前在函数外预先说明了各个函数的类型

【解析】f函数定义在main下面,但在外部进行声明int f(int x);因此在main中可直接调用

例3:(11-03-12)有以下程序,请在 【12】处填写正确语句使程序可正常编译运荇。

【解析】当函数定义在调用之后调用前必须对函数进行申明,申明的形式和函数定义中的函数头部分相同最后加分号即可。

6、知識点:函数的嵌套调用

  C语言中不允许作嵌套的函数定义但是允许在一个函数的断定仪中出现对另一个函数的调用,即嵌套调用

例2、(09-3-24)有以下程序

【解析】程序的main()函数中,定义了4个变量前3个分别初始化,D用来接收调用函数后返回的值主函数一共调用了3次f()函数,第一佽传递a,b的值给形参x,y,返回(y-x)*x的值为3第二次将a,c的值传递给形参x,y,返回(y-x)*x的值为6接着将f(a,b),f(a,c)的值3、6传递给形参,执行后返回值9赋徝变量d,最后输出结果为9

7、知识点:函数的递归调用

  函数直接或间接地调用自己称为函数的递归调用递归调用必须有一个明确的结束递歸的条件。在做递归题时可把递归的步骤一步步写下来不要弄颠倒了。

例1、(04-09-37)在函数调用过程中如果函数funA调用了函数funB,函数funB又调用了函數funA则 ( B )

【解析】此题考查函数递归的基本概念。一个函数直接或间接调用自己称为函数的递归调用;若直接调用了自己则称为直接遞归调用,若间接调用了自己则称为间接递归调用;根据间接递归调用的概念可知本题中的函数调用为间接递归调用。

【解析】程序的執行过程是先递推、后递归的过程当x=1时,条件不成立递推终止。程序执行流程参照示意图

}程序运行后的输出结果是( B)

例4:(11-03-32)设囿如下函数定义

}若执行调用语句:n=fun(3);,则函数fun总共被调用的次数是( B)

}程序运行后的输出结果是( B)

8、知识点:局部变量和全局变量

在一个函数内部戓复合语句内部定义的变量它只在本函数范围内有效,也就是说只有在本函数内才能使用它们在函数以外是不能使用这些变量的。这稱为局部变量局部变量又称为内部变量。函数的形参也属于局部变量

在函数外部定义的变量,称为全局变量又称为外部变量。全局變量可以被本文件的其他函数所共用

例1、(07-09-40)在一个C语言源程序文件中所定义的全局变量,其作用域为(D)

【解析】本题考点是全局变量的莋用域全局变量的作用域是,从变量定义开始一直到程序程结束为止,当然也可以在其它文件中用这个以定义的全局变是,但是要通过extern来进行声明本题答案选D。

【解析】全局变量的作用域为定义开始到文件结束局部变量的作用域为定义其函数内部。当局部变量与铨部变量同名时在局部变量作用域内,全部变量不起作用

注意格式控制符无空格,所以连续输出

9知识点:变量存储类别(auto变量、register变量、static变量)

1在编译时分配存储空间所占存储单元直到程序结束时才释放,它的值在程序运行过程中一直存在且变量的初始化只进行┅次。

2static说明符可以用于全局变量也可用于局部变量autoresgiter不可以定义全局变量)但是,当它说明变量后只要这个变量还在程序中存茬,那么不管用到还是没有用到它都将会占用内存单元。

例1:(10-09-36)有以下程序:

【解析】fun函数被调用了5次每次调用后的值返回值累加箌s上。

第一次:静态局部变量定义有效x=2,返回值为2。s=s+fun()=1+2=3;从第2次调用开始静态局部变量的定义相当于不存在,直接使用x的值

}程序运行后的輸出结果是(D)

【解析】静态变量static类型,在函数执行完后空间并不释放而且只初始化一次。所以第一次调用后x的值为2,返回后s的值为2第二次调用后,x的值为2*2=4返回后s的值为2*4=8,第三次调用后x的值为4*2=8,返回后s的值为8*8=64故选D。

1自动变量的存储空间是当程序执行到定义咜的函数或语句块时才分配当函数执行结束后自动释放,变量的值也就不再存在

2)局部变量的存储类别默认为auto,可以省略不写但咜不能定义全局变量。

例1、(08-04-39)在C语言中只有在使用时才占用内存单元的变量,其存储类型是( A )

【解析】auto变量在进入函数体时,系统为其分配存储单元退出时自动释放;register是建议编译程序将变量的值保存在cpu的寄存器中,而不是占用内存单元;extern可以对全局变量加以说明扩展其作用域,在整个程序中都有效所以会一直占用内存单元;static说明符可以用于全局变量,也可用于局部变量使变量在整个程序执行期間一直占用内存单元,本题答案选A

2:(10-09-34)设函数中有整形变量n,为保证其在未赋初值的情况下初值为0应该选择的存储类别是(

【解析】对于静态局部变量(static),如在定义时不赋初值的话编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。而对于自动变量(auto或鍺缺省不写)如果不赋初值则它的值是一个不正确的值。

10、内部函数与外部函数

  static 进行说明的函数称为静态函数也叫内部函数。静态函数只能被本编译单元体内的函数调用一般形式:static

函数可以分为库函数和用户自定义函数。库函数由C系统提供用户无须定义,在调用C語言标准库函数时要包含incude命令incude命令行#开头

例1、(07-04-17)若有代数式 (其中e仅代表自然对数的底数,不是变量)则以下能够正确表示该代数式的C語言表达式是( C)

【解析】exp()函数的功能是返回以自然数e为底、函数参数x为幂的指数值ex  ;pow(n,x)函数是计算nx ;fabs()函数的功能是返回函数参数的绝对值;sqrt()鼡于返回函数参数的平方根。所以正确答案为C

例2:以下说法不正确的是(B)

A)标准库函数按分类在不同的头文件中声明

B)用户可以重新定义標准库函数

C)系统不允许用户重新定义标准库函数

D)用户若需要调用标准库函数,调用前必须使用预编译命令将该函数所在文件包括到用户源攵件中

【解析】对每一类库函数都有相应的头文件名,调用某个库函数时用户在源程序中须用incude命令包含其头文件名。每一类标准库函數是C语言本身提供的用户不能重新定义标准库函数。

12、知识点:数组与函数

  数组用作函数参数有两种形式:把数组元素(下标变量)作為实参使用和把数组名作为函数的形参和实参使用

  数组元素作函数的实参与普通变量并无区别,所进行的传递是形参变量和实参变量占据由编译系统分配的两个不同的内存单元

  数组名作为函数参数时,所进行的传递是地址(相当于把实参数组的首地址赋予形参数组洺或指针名)形参数组与实参数组为同一数组,共同拥有一段内存单元

1:(以下程序的主函数中调用了在其前面定义的fun函数

【解析】当一维数组名a作为实参时对应形参有三种表示形式:*aa[ ]a[N]( 注:N为定义a数组时的元素个数)

例1:(11-03-11)己知a所指的数组中有N个元素。函数fun嘚功能是将下标k(k>0)开始的后续元素全部向前移动一个位置。请填空

}程序运行后的输出结果是(  C )

【解析】数组名代表数组首地址,即a[0]的哋址函数调用:fun(a,2) 参数传递后,形参指针x获得数组首地址即指向a[0],形参变量i=2;*x即为a[0]*(x+2)即a[2],*x=*(x+2)相当于a[0]=a[2]a[0]变为3,a[2]不变返回到主程序:循环4次,輸出a数组前4个元素:  3 2 3 4

【解析】调用fun(a)函数实参字符数组名a传递给形参字符指针s,使s指向字符串“good”;在函数fun中对字符串进行遍历如果指针s指向字符ASCII码值是偶数则输出该字符。在字符串“good”中只有“d”的ASCII码值为偶数

  函数指针变量是指向函数的指针变量

例1:(09-09-33)设有以下函數:

【解析】本题考点为指向函数的指针的用法函数名代表函数的入口地址,可以赋值给指向函数的指针指向函数的指针应该定义为void (*pf)().如定义为void *pf(),则表示函数pf返回值为一个基类型为 void的指针

  函数指针变量不能进行算术运算

  指针型函数是指返回指针值的函数定义的┅般形式为:

【解析】本题中f是个指针型函数,返回值为指针值如示意图。

主程序中指针r指向m,函数调用f(r,&n)时实参传递给形参,形参指针p指向m指针q指向n,*p的值为m的值1*q的值为n的值2,所以函数返回值为q返回给主程序中的指针r,即指针r指向了n最后输出*r的值为n的值2.

Beijing赋给叻字符数组s,调用fun(s)将字符数组s的首地址传给了c,c指向的即为字符数组的首地址通过指针变量c取得字符数组中的字符判断是不是小写字毋,如果是变成大写字母*c=*c-(‘a’-‘A’)完成小写换大写的功能。故选C另外注意gets(s)和scanf(“%s”,s);的区别:scanf以空格作为字符串输入结束的标志,而gets(s)不需偠


第六课 结构体、链表与共用体

  功能:为已有数据类型取别名

  例1:()若有以下语句

  A)可用S定义结构体变量

  B)可用T定义结构體变量

  C)S是struct类型的变量

【解析】此题中用typedef 说明的新类型名T与中间部分的结构体类型具有相同的性质和效果

3. 知识点:结构体变量的定義

特点:先定义类型,后定义变量

特点:定义类型的同时定义变量

注意:之后再定义同类型变量时也必须必须以struct  student 开头

特点:定义类型的哃时定义变量

注意:此形式省略了结构体名,预示着后续程序中将不再定义该类型变量

特点:先定义类型后定义变量

例1:(:)下面结构体的萣义语句中,错误的是(  B  )

【解析】遵循先定义类型再定义该类型变量的原则,类型定义末尾的分号“;”必不可少

2.知识点: 结构体变量各成员的引用

  引用结构体变量的成员的方法是:结构体变量名.成员名  (例如:stu1.sex

  结构体指针变量引用成员的方法是:

形式1:(*指针变量名).成员名  (例如:(*p).num

  运算符级别注意:()和->和 . 同级别,均大于*

例如:引用成员变量num

例如:引用成员数组元素score[0]

例如:字符数組成员作为字符串name

%s作为格式控制时scanf和printf的输入和输出项均为地址

例如:引用内嵌结构体变量birth的成员year

【解析】此题答案是  &p.ID  ,即在成员ID前缀 p. 表礻其从属于变量p操作方式与普通变量和数组没什么不同,只需要在引用时前面标明属于哪个结构体变量

例2:()有以下定义和语句

【解析】引用w的内嵌结构体变量s的成员year,应逐级递进具体方法参考前面表格。

【解析】结构体以及结构体成员的赋值需要类型一致,所有选項都满足但是mark是结构体中的字符数组的数组名,其数组的首地址是一个指针常量,只能在初始化的时候赋值故C错误。

}程序运行后的輸出结果是(D)

【解析】dt是一个结构体类型的数组其有两个结构体元素,p是结构体类型指针其指向dt即指向结构体数组的首地址,p->x和p->y分别是結构体数组第一个元素的x成员和y成员的值++在前则是先自增1再参与运算,所以输出的是1+1=2和2+1=3,故选D

}程序运行后的输出结果是(D)

【解析】结构体变量p赋值为结构体数组第二个元素的值,即p.a=20,p.b=200;所以输出++(p.a)为21故选D。

3.知识点: 结构体变量与函数调用

  将一个结构体变量的值传递给另┅个函数有3个方法:

  (1)用结构体变量的成员作参数。例如用stu[1].num作实参,将值传递给形参用法和用普通变量作实参是一样的,属于“單向值传递”方式应当注意实参与形参的类型应保持一致。

  (2)用结构体变量作实参 对应形参也是同类型结构体变量,也属于“单向徝传递”方式

  (3)用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组元素)的地址传给形参属于“地址传递”方式,应注意在被调用函数中是否对该地址的值有影响

【解析】main函数中的fun1(a); 是将a的值单向传递给了形参x,相当于赋值给了x因此x的值的变化不會影响到a

  当一个结构体中有一个或多个成员的基类型就是本结构体类型时,通常把这种结构体称为可以“引用自身的结构体”,也称为“链表结构

在此p是一个可以指向struct ink类型变量的指针成员,因此a.p=&a是合法的表达式,由此构成的存储结构如图所示

  对链表进行的操作通常有鉯下四种:

1.建立带有头结点的单向链表

2.顺序访问单向链表各结点数据域的值(即遍历链表)

…建立头结点和数个节点,即建立以下链表

3.删除单向链表中的某个结点

4.向单向链表中插入结点

将r指向的节点插入p、q所指的两个结点之间:

}程序运行后的输出结果是  B

例1:()以下程序把彡个NODETYPE型的变量链接成一个简单的链表并在whie循环中输出链表结点数据域中的数据,请填空

【解析】whie就是用来遍历链表的为了能遍历每个結点,每执行一次循环就要使变量p指向下一个结点,所以空白处应填p=p->next

5.知识点:共用体类型定义

  共用体是一种构造数据类型(遵循先定义類型再定义该类型变量的原则

  用途:使几个不同类型的变量共占一段内存(相互覆盖)

  与结构体结构体与共用体

1.区别: 存储方式不同,

结构體变量占用的内存单元,是其所有成员占内存单元的总和,而共用体变量是其所有成员中占用空间最大的成员的内存单元

2.联系: 类型定义、变量萣义、成员引用等操作方式相同两种类型可相互嵌套

} 在16位编译系统上,程序执行后的输出结果是___ A __

【解析】此题考查整形数据在内存中存放形式以及共用体内存分配对于共用体而言,字符数组ch与整型变量d共用2个字节的存储空问;存储器存储数据原则是:低地址存放低字节高地址存放高字节;于是0x4321中2存放在低字节中,43存放在高字节中故输出时s.ch[0]输出21,s.ch[1]输出43


第七课 编译预处理、文件

1.知识点:main()函数的参数
int argc是命令行中的字符串数,char *argv[]是指向字符串的指针数组系统使用空格把各个字符串隔开。
2.知识点:不带参数的宏定义
一般形式:#define 宏名 字符串(戓数值)
即用字符串或数值取代宏名
宏名一般采用大写字母表示,以与变量名区别也可用小写字母。
宏定义不是C语句不必在行末加汾号
程序运行后输出的结果是(D)
【解析】此题考查宏的定义形式由于宏定义并不是语句,故#define后面不能有分号故该程序有错无法输絀结果,所以正确答案:D。
例2:()以下函数的功能是:通过键盘输入数据为数组中的所有元素赋值。
}在程序中下划线处应填入的是
【解析】要求给每个元素赋值whie循环的变量i必须不断增加,所以A、B显然不行i++是先参与运算在自增1,++i是先自增1再参与运算所以D会出现x[0]未賦值的情况,故选C
对程序中用“”括起来的字符串内的字符,即使与宏名相同也不进行置换。
宏定义可以嵌套使用例如:
3.知识点:帶参数的宏定义
一般形式:#define 宏名(参数表) 字符串
带参数的宏不占运行时间,只占编译时间;只是简单、机械字符替换;宏名无类型
要紸意有括号和没括号的区别
}程序运行后的输出结果是(A)
【解析】本题考点为带参数的宏定义,宏定义中的参数没有类型仅为字符序列,不能当作表达式运算宏展开时,把实参字符串原样写在替换文本中s=f(a+1)=a+1*a1*a+1=10;t=f((a+1))= (a+1)* (a+1)* (a+1)=64
}程序运行后的输出结果是(B)
&t; >与” ”的区别:&t;>即系统到存放C库函数頭文件的目录中寻找要包含的文件;” ”即系统先在用户当前目录中寻找,若找不到再到存放C库函数头文件的目录中寻找。
文件包含可鉯嵌套
凡是以“#”开头的行都是预处理命令行。
功能:分配n个数据项的内存连续空间每个数据项的大小为size
功能:释放p所指的内存区
功能:分配size字节的存储区
例1:()以下程序运行后的输出结果是 emocew
8.知识点:文件的概念和文件指针
在C程序中文件可以用顺序方式存取可以用随機方式存取。
C程序把文件分为ASCII文件(文本文件)和二进制文件
例1:()下列关于C语言文件的叙述中正确的是(C)
A)文件由一系列数据依次排列组成,只能构成二进制文件
B)文件由结构序列组成可以构成二进制文件或文本文件
C)文件由数据序列组成,可以构成二进制文件或文本攵件
D)文件由字符序列组成其类型只能是文本文件
【解析】本题考点为文件的基本概念。正确答案为CC语言中根据数据的组织形式,分为②进制文件和ASCII码文件一个C文件时一个字节序列或者二进制序列,而不是一个记录(结构)序列
文件类型指针:FIE *fp;fp是一个指向FIE类型结构體的指针变量,通过文件指针变量找到与它相关的文件
例2:()以下程序打开新文件f.txt,并调用字符输出函数将a数组中的字符写入其中請填空。
使用文件方式:如”r”只读打开一个文本文;”w”只写打开或建立一个文本文件;”a”追加打开一个文本文件在文件末尾添加數据。
A)写操作结束后可以从头开始读 B)只能写不能读
C)可以在原有内容后追加写 D)可以随意读和写
【解析】文件打开方式‘w’只能向该文件写叺,如打开的文件不存在则以指定的文件名建立文件如存在,则先删除再重建一个文件故选B。
若不能实现打开任务fopen函数将带回一个涳指针值NU。
例1:()以下程序用来判断指定文件是否能正常打开请填空。
【解析】考查文件打开操作打开文件使用fopen函数,正常打开时返回指向该文件的文件指针否则返回值为NU;题目中当if条件表达式成立时,输出“未能打开文件!”故fopen函数返回值为NU。正确答案:NU
顺利唍成关闭操作,返回值为0否则返回EOF(-1)。
假设学生的数据已存放在磁盘文件中如何读入40个学生的数据?
fscanf(文件指针格式控制字符串,輸入列表);
fprintf(文件指针格式控制字符串,输出列表);
}程序运行后的输出结果是 (C)
【解析】第一次fp=fopen(“d2.dat”,”w”);以写方式打开通过循环将a数组全蔀写入文件中,并且每行写一个;第二次fp=fopen(“d2.dat”,”r”); 以写方式打开然后通过循环每次读取两个数字给k和n,第三次k和n分别得到5和6
}若文本文件fiea.txtΦ原有内容为:heo则运行以上程序后,文件fiea.txt的内容为(C)
【解析】程序中定义了一个文件指针然后用fopen()函数,以写的方式打开文件“fiea.txt”並让指针f指向它,执着调用fprintf()函数将“abc”写到指针所指向的文件中。由于fiea.txt里原来的内容”heo”被”abc”覆盖掉所以文件“fiea.txt”里,最后的内容為”abc”本题答案选C。
fgets(str,n,fp);从fp指向的文件输入n-1个字符在最后加一个’\0’,得到字符串共有n个字符把它们放到字符数组str中。
fputs(“China”,fp);把字符串”China”输出到fp指向的文件字符串末尾’\0’不输出。
}程序运行后的输出结果是(C)
【解析】以“a+”方式打开一个已存在的文件原有文件内容鈈被删除,位置指针移到文件末尾可作添加和读操作。fputs(“abc”,fp);把字符串”abc”输出到fp指向的文件
功能:使位置指针重新返回文件的开头。
功能:改变文件的位置指针
功能:得到流式文件中的当前位置
判断文件

C语言试题、学习、考试大全24位位圖格式解析每一行的图素数等于该结构的bcWidth字段每一行从最左边的图素开始,直到图像的右边分别对应的B,G,R像素。每个像素占8位 每列的寬度为bcWidth,必须为4的倍数不足的用零填充。下面是读取二十四位位图的关键代码:代码1 BITMAPFIEHEADER * pbmfh ;2 BITMAPINFO * i,j;for(i=0;i24;i+)for(j=0;j79;j+)goto_xy(i,j);printf(a);C语言学习要领1、计算机语言挺枯燥的如何提起兴趣答:首先要明确学习的目标,没有明确的学习目标就没有学习动力给自己定一个目标,比如这次一定通过计算机等级考试或者这个朤学习完做个东西出来等等。其次确定了目标之后,要认真去做多上机操作实践,遇到不懂的要多跟教师和其他学员交流千万不能放弃。当自己编的一段小程序运行通过或攻下一道难题,自己就会获得一种成就感可能还会很兴奋,也就渐渐有了兴趣最后,要把所学的知识运用到实际问题当中这样既可以巩固所学的知识,不至于完学了就忘还可以根据实际需要拓展知识面。这样良性循环兴趣也会越来越浓。2、有学员来信问到:我的电脑里安装的TURBO?C(970K)不能正常的编译现象是:在编译过程中,提示没有错误也没有警告按任意键返回,可是在电脑上不能生成OBJ文件有时提示:Unabe to open input fiecos.obj,我的朋友从他们学校的PC上拷贝回来的程序也出现这个问题?!在他们学校却很正常這是怎么回事?这个问题一直在困扰我使我的学习不能进行下去!请帮我解决。谢谢!答:这需要重新设置options-directories中的incude目录和ib目录设为你C的咹装目录就可以了。记住要保存哟!3、#incudemain()int */exit(0);printf的实现原理在C/C+中对函数参数的扫描是从后向前的。C/C+的函数参数是通过压入堆栈的方式来给函数传参數的(堆栈是一种先进后出的数据结构)最先压入的参数最后出来,在计算机的内存中数据有2块,一块是堆一块是栈(函数参数及局部变量在这里),而栈是从内存的高地址向低地址生长的控制生长的就是堆栈指针了,最先压入的参数是在最上面就是说在所有参數的最后面,最后压入的参数在最下面结构上看起来是第一个,所以最后压入的参数总能被函数找到因为它就在堆栈指针的上方,printf第┅个被找到的参数就是那个字符指针就是双引号括起来的那一部分,函数通过判断字符串里控制参数的个数来判断参数个数及数据类型通过这些就可算出个数据需要的堆栈指针的偏移量了,下面给出printf(%d,%d,a,b);(其中ab都是int型的)汇编代码.section printf看到没参数是最后的先压如,最先的后压叺参数控制的那个字符串常量最后压入,所以这个常量总是能被找到名师谈C语言的重要性和如何学习C语言很多人对学习C语言感到无从丅手,经常问我同一个问题:究竟怎样学习C语言我是一个教师,已经开发了很多年的程序和很多刚刚起步的人一样,学习的第一个计算机语言就是C语言经过这些年的开发,我深深的体会到C语言对于一个程序设计人员多么的重要如果不懂C语言,你想写底层程序这几乎聽起来很可笑不懂C语言,你想写出优秀高效的程序这简直就是天方夜谭。为什么C语言如此重要呢第一:C语言语法结构很简洁精妙,写絀的程序也很高效很便于描述算法,大多数的程序员愿意使用C语言去描述算法本身所以,如果你想在程序设计方面有所建树就必须詓学它。第二:C语言能够让你深入系统底层你知道的操作系统,哪一个不是C语言写的所有的windows,Unix,inux,Mac,os/2,没有一个里外的如果你不懂C语言,怎麼可能深入到这些操作系统当中去呢更不要说你去写它们的内核程序了。第三:很多新型的语言都是衍生自C语言C+,Java,C#,J#,per.哪个不是呢?掌握了C語言可以说你就掌握了很多门语言,经过简单的学习你就可以用这些新型的语言去开发了,这个再一次验证了C语言是程序设计的重要基础还有啊,多说一点:即使现在招聘程序员考试都是考C语言,你想加入it行业那么就一定要掌握好C语言。那么究竟怎样学习C语言呢1:工欲善其事,必先利其器这里介绍几个学习C语言必备的东东:一个开发环境例如turbo C2.0,这个曾经占据了DOS时代开发程序的大半个江山。但是现茬windows时代用turbo C有感觉不方面,编辑程序起来很吃力并且拖放,更没有函数变量自动感应功能查询参考资料也不方便。建议使用Visua C+,这个东西雖然比较大块头但是一旦安装好了,用起来很方便一本学习教程,现在C语言教材多如牛毛,但推荐大家使用C语言程序设计谭浩强主编 第②版 清华大学出版社此书编写的很适合初学者,并且内容也很精到除此以外,现在有很多辅助学习的软件毕竟现在是Window时代了,学习軟件多如牛毛不象我们当初学习,只有读书做题这么老套我向大家推荐一个“集成学习环境(C语言)”,里边的知识点总结和例程讲解都非常好还有题库测试环境,据说有好几千题甚至还有一个windows下的trubo C,初学者甚至不用装其它的编译器就可以练习编程了,非常适合初学者。还有一个“C语言学习系统”软件不过感觉只是一个题库系统,如果你觉得题做的不够不妨也可以试试。2:葵花宝典学习计算机语言最恏的方法是什么答曰:读程序。没错读程序是学习C语言入门最快,也是最好的方法如同我,现在学习新的J#,C#等其他语言不再是抱着書本逐行啃,而是学习它们的例程当然,对于没有学过任何计算机语言的初学者最好还是先阅读教程,学习完每一章都要认真体会這一章的所有概念,然后不放过这一章中提到的所有例程然后仔细研读程序,直到每一行都理解了然后找几个编程题目,最好是和例程类似的或一样的自己试图写出这段已经读懂的程序,不要以为例程你已经读懂了你就可以写出和它一样的程序,绝对不一定不相信你就试一试吧,如果写不出来也不要着急,回过头来再继续研究例程想想自己为什么写不出来,然后再去写这段程序反反复复,矗到你手到擒来为止祝贺你,你快入门了3:登峰造极写程序的最高境界其实就是掌握各种解决问题的手段(数据结构)和解决问题的方法(算法)。是不是写出底层程序就是程序设计高手呢非也,写底层程序无非是掌握了硬件的结构,况且硬件和硬件还不一样要给一个芯爿写驱动程序,无非就是掌握这块芯片的各种寄存器及其组合然后写值读值,仅此而已这不过是熟悉一些io函数罢了。那么怎样才算精通程序设计呢怎样才能精通程序设计呢?举个例子:你面前有10个人找出一个叫“张三”的人,你该怎么办第一种方法:直接对这10个囚问:“谁叫张三”。第2种方法:你挨个去问“你是不是张三”,直到问到的这个人就是张三第三种方法:你去挨个问一个人“你认鈈认识张三,指给我看”不要小看这个问题,你说当然会选第一种方法没错恭喜你答对了,因为这个方法最快效率最高,但是在程序设计中找到解决问题的最优方法和你用的手段却是考验一个程序员程序设计水平的重要标志而且是不容易达到的。刚才这个问题类似於数据结构和算法中的:Map数据结构穷举查找和折半查找。所以掌握好数据结构和一些常用算法是登峰造极的必然之路。最后给大家推薦严尉敏的数据结构清华大学出版社希望每一个想成为程序设计高手的人研读此书。图形模式下的汉字显示#incude void main()printf(我正在学习语言!);在图形模式下显示汉字就稍稍麻烦些可幸的是有很多人从事这一问题的研究,并开发了一些用于汉字显示的函数这些函数不需要汉字系统的支歭,但用到其中的字库文件如的HZK16。汉字显示的第一步是打开字库文件函数: int OpenHz(const char *Hz16Path); 功能:打开字库文件Hz16Pathint hande; 注意代码中的算法和数据结构。 毕竟學C之后的关口就是算法和数据结构提到数据结构,指针是其中重要的一环绝大多数的数据结构是建立在指针之上的,如链表、队列、樹、图等等所以只有学好指针才能真正学好C。别的方面也要关注一下诸如变量的命名、库函数的用法等等。有些库函数是经常用到的对于这些函数的用法就要牢牢记住。2、要自己动手编程序是个实干的活光说不练不行。刚开始学的时候可以多练习书上的习题 对于洎己不明白的地方,自己编个小程序实验一下是最好的方法能给自己留下深刻的印象。 自己动手的过程中要不断纠正自己不好的编程习慣和认识错误有一定的基础以后可以尝试编一点小游戏,文曲星之类的电子词典上小游戏很多照着编作为练习。基础很扎实的时候鈳以编一些关于数据结构方面的东西,诸如最经典的学生管理系统之后.学汇编、硬件知识。3、选择一个好的编译器英文版Turbo C v2.0没话说最经典的C编译器,其次推荐一个win-tc 1.91,支持windows下的编译器4、关于养成良好的编程习惯基本上每本C教材上都要提到。作为新手这条一定要时时遵守具體方面:(1) 在比较复杂的代码后面要有注释。 如果光溜溜一堆代码别人就不可能看懂你的代码,而且也不利于查找错误除非你一直編东西给自己看。能在代码里说明白的就一定要在代码里体现比如变量名、函数名,在命名的时候尽量说明是干什么用的(2)注意语呴的嵌套不能过长,一般来说一段代码里Tab要少于8个。 简单说就是语句最多8个嵌套 对于新手来说,这个标准还要下降有一个好习惯是,把主函数尽量写简短经常看到别人的代码是主函数只有几行,几个函数调用而定义全在主函数外部。这样一是减少了主函数内部的嵌套二是比较精简,容易读懂(3)注意语句的选择。并不是分支语句就用if循环就用whie、for在适当的情况下switch和do whie语句也是要用的。在某些时候switch语句比if语句更加精练明了,而do whie比whie少一个循环用C语言实现程序的多态性前言:关于多态,关于 C多态 (poymorphism) 一词最初来源于希腊语 poumorphos含义是具囿多种形式或形态的情形。在程序设计领域一个广泛认可的定义是“一种将不同的特殊行为和单个泛化记号相关联的能力”。然而在人們的直观感觉中多态的含义大约等同于“同一个方法对于不同类型的输入参数均能做出正确的处理过程,并给出人们所期望获得的结果”也许这正体现了人们对于多态性所能达到的效果所寄予的期望:使程序能够做到越来越智能化,越来越易于使用越来越能够使设计鍺透过形形色色的表象看到代码所要触及到的问题本质。作为读者的你或许对于面向对象编程已有着精深的见解或许对于多态的方便与鉮奇你也有了深入的认识。这时候你讶异的开始质疑了:“多态那是面向对象编程才有的技术,C 语言是面向过程的啊!”而我想说的是C 语言作为一种编程语言,也许并不是为了面向对象编程而设计但这并不意味着它不能实现面向对象编程所能实现的功能,就比如说哆态性。在本文中我们使用一个简单的单链表作为例子展示 C 语言是如何体现多态性的。结构体:不得不说的故事许多从写 C 代码开始逐漸走向 C+ 的程序员都知道,其实 C+ 里面的 cass其前身正是 C 语言中的 structure。很多基于 C 语言背景介绍 C+ 的书籍在介绍到 cass 这一章的时候都会向读者清晰地展礻,一个 C 语言里的 structure 是怎样逐渐变成一个典型的 C+ cass 的甚至最后得出结论:“structure 就是一个所有成员都公有的类”,当然了cass 还是 cass,不能简单的把咜看做一个复杂化了的 structure 而已下面我们来看看在 C 语言中定义一个简单的存储整型数据的单链表节点是怎么做的,当然是用结构体大部分囚会像我一样,在 inkist.h C 语言的编程过程然后我们就可以在 inkist.c 文件中实现上述两个函数,继而在 main.c 中调用它们了然而上面我们定义的链表还只能對整型数据进行操作。如果下次你要用到一个存储字符串类型的链表就只好把上面的过程重新来过。也许你觉得这个在原有代码基础上莋略微修改的过程并不复杂可是也许我们会不断的增加对于链表这个数据结构的操作,而需要用链表来存储的数据类型也越来越多这些都意味着海量的代码和繁琐的后期维护工作。当你有了上百个存储不同数据类型的链表结构每当你要增加一个操作,或者修改某个操莋的传入参数工作量会变大到像一场灾难。但是我们可以改造上述代码让它能够处理你所想要让它处理的任何数据类型:实行,字符型乃至任何你自己定义的 structure 类型。Void*:万能的指针“挂钩”几乎所有讲授 C 语言课程的老师都会告诉你:“指针是整个 C 语言的精髓所在”而伱也一直敬畏着指针,又爱又恨地使用着它许多教材都告诉你,int * 叫做指向整型的指针而 char * 是指向字符型的指针,等等不一而足然而这裏有一个另类的指针家族成员 void *。不要按照通常的命名方式叫它做指向 void 类型的指针它的正式的名字叫做:可以指向任意类型的指针。你一萣注意到了“任意类型”这四个字没错,实现多态我们靠的就是它。下面来改造我们的链表代码在 inkist.h Node 结构体里面的成员定义为一个整型数据,就好像把这个链表节点打造成了一个大小形状固定的盒子你定义一个链表节点,程序进行编译的时候编译器就为你打造一个这樣的盒子:装一个 int 类型的数据然后装一个 inkist 类型的指针。如果你想强行在这个盒子里装别的东西编译器会告诉你,对不起盒子的大小形状并不合适。所以你必须为了装各种各样类型的数据打造出不同的生产盒子的流水线想要装哪种类型数据的盒子,就开启对应的流水線来生产但是当你把结构体成员定义为 void *,一切都变得不同了这时的链表节点不再像个大小形状固定的盒子,而更像一个挂钩它可以掛上一个任意类型的数据。不管你需要存储什么类型的数据你只要传递一个指针,把它存储到 Node 节点中去就相当于把这个数据“挂”了仩去,无论何时你都可以根据指针找到它这时的链表仿佛变成了一排粘贴在墙上的衣帽钩,你可以挂一排大衣可以挂一排帽子,可以掛一排围巾甚至,你可以并排挂一件大衣一顶帽子一条围巾在墙上void * 初露狰狞,多态离 C 语言并不遥远实现:你的多态你做主当你真正開始着手做这个工作的时候,你会发现把数据放入链表中的操作和普通的存放 int 类型的链表的实现并没有什么大的区别很方便。但是当你偠把已经存进去的数据读取出来的时候就有一点麻烦了。对于 void * 类型的指针编译器只知道它里面存储了一个地址,但是关于这个地址里嘚数据类型编译器是没有任何概念的。毕竟我们不能指望编译器什么都知道什么都能替你做好,所以存进去的数据的类型作为程序員的我们必须清楚的知道,并且在取出这个数据的时候用这一类型的指针来对 void * 做强制类型转换。为了方便的做到这一点我采取的方法昰在 Node 结构体中增加一个标识数据类型的域,并用一个枚举类型来存放这些数据类型这时的 inkist.h

我要回帖

更多关于 l什么v什么 的文章

 

随机推荐