C语言部分重要考点疑难精解.doc

上传人:自*** 文档编号:126235617 上传时间:2020-03-23 格式:DOC 页数:11 大小:91.50KB
返回 下载 相关 举报
C语言部分重要考点疑难精解.doc_第1页
第1页 / 共11页
C语言部分重要考点疑难精解.doc_第2页
第2页 / 共11页
C语言部分重要考点疑难精解.doc_第3页
第3页 / 共11页
C语言部分重要考点疑难精解.doc_第4页
第4页 / 共11页
C语言部分重要考点疑难精解.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《C语言部分重要考点疑难精解.doc》由会员分享,可在线阅读,更多相关《C语言部分重要考点疑难精解.doc(11页珍藏版)》请在金锄头文库上搜索。

1、C语言部分重要考点疑难精解1 数据类型(常量与变量)11.1 字符常量11.2 符号常量及宏定义11.3 指针变量及其运算22. 数组与指针、字符串处理32.1 字符串、字符数组与指针32.2 二维数组及指针43. 函数63.1 参数处理顺序63.2 库函数63.3 有参函数的定义64. 共用体、结构体与单向链表84.1 共用体变量、数组的定义84.2 指针与结构体84.3 单向链表的逆向建立91 数据类型(常量与变量)1.1 字符常量字符常量是用两个单引号前后括住的单个字符来表示。其中转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。转义字符主要用来表示那些用一般字符不便于表示

2、的控制代码(用其ASCII码值的八进制或十六进制表示)。因为ASCII码表中字符的最大码值为127或255,而127=(177)8=(7F)16,255=(377)8=(FF)16,所以八进制形式最多要用3位、十六进制形式最多要用2位就够表示了。其中 ddd 即表示是13位8进制数对应的符号, xhh 是12位16进制数对应的符号,比如:101,(101)8即(65)10,是字符A的ASCII码值,故101表示字符A;x41,(41)16即(65)10,也表示字符A。由于在内存中,字符数据以ASCII码存储,它的存储形式就与整数的存储形式类似,于是,一个字符数据既可以以字符形式处理、输出,也可

3、以以整数形式处理、输出。但容易出现溢出问题(C语言编译不报错),例如:(07秋)24若有程序段“char c=256;int a=c;”,则执行该程序段后a的值是_。 A256 B65536 C0 D-1由于8个二进制位所能表示的最大无符号整数是(1111 1111)2 ,即(255)10 ,而(256)10=(28)10=(10000 0000)2,最高位1溢出被舍弃,故本题结果为0。1.2 符号常量及宏定义符号常量的定义实际是“宏”定义的特例。所谓“宏”定义就是在程序的开始将一个“标识符”定义成“一串符号”,这个“标识符”称为宏名;在源程序中可以出现这个宏,称为“宏引用”或“宏调用”;在源

4、程序编译前,将程序清单中每个“宏名”都原样替换成对应的“一串符号”,称为“宏替换”或“宏扩展”。为了区别于一般的变量名等,宏名通常用大写字母组成。宏定义是以“#define”开头的编译预处理命令,分为无参宏和带参宏两种。NULL、EOF是系统提供的符号常量,分别与0、-1等值,使用前必须在程序开头加上“#include stdio.h或#include ”编译预处理命令。NULL一般用来表示空地址值,与0、0可等值互换使用;EOF为一些系统函数的返回值。1.3 指针变量及其运算指针是一种数据类型。所谓指针,就是指存放数据的内存地址。指针变量中存放的数据就是地址值。指针变量的定义形式是:数据类型

5、名 * 指针变量名;注意:定义时指针变量名前的*仅仅是一个标志,不具备“取内容符”的含义; 指针变量必须在获得合法空间的地址值之后,方能进行各种运算、处理; 指针变量可以与整数进行加减运算,例如,有下列程序段:int a,*p;p=&a;若p中值为FFDE(十六进制),则p+1的值为FFE0,即前者加上2的结果,含义是p+1为p所指数据空间的下一个数据空间的地址值,int型数据占据的空间字节数为2;两个同样类型的指针变量可以进行减法运算,运算结果为整数,值为两个指针变量所指空间地址之间的空间个数值(有正、负之分)。二者不能进行加法运算。例如,有下列程序段: int a,b,*p,*q;p=&a

6、;q=&b; 若p值为FFDE,q值为FFE0,则p-q的值为-1,q-p的值为1。注意,int型数据占据的一个空间字节数为2。 两个同样类型的指针变量可以进行关系运算,上例中,pq是成立的。2. 数组与指针、字符串处理2.1 字符串、字符数组与指针由于在C语言中字符串只有常量形式,没有变量形式,故而用字符数组、字符指针来灵活处理字符串。1)用字符数组存放字符串字符串可以存放在字符数组中,但字符数组中存放的未必是字符串。例如:char a=H,i,0;char b=B,y,e;char c=Go;字符数组a、b、c的长度均为3,但a、c中存放的是字符串,b中存放的不是字符串。一定要注意0是字符

7、串的结束标志;还要注意在定义的同时可以将字符串用“=”赋值给字符数组,定义之后必须借助strcpy函数才能将字符串赋值给字符数组,千万不能用“=” 赋值。2)用字符指针指向字符串字符串指针变量的定义说明与指向字符变量的指针变量的说明是相同的。只能按对指针变量的赋值不同来区别。如果字符串已经存放在某个字符数组中,可以用赋值方式将指针变量指向该字符数组,以后可以用指针变量来处理字符数组中存放的字符串,也可以使用指针变量来处理其中的单个字符,处理方法类似于一维数组。C语言允许直接使用字符串常量,并不一定要求字符串存放在字符数组中。这样的字符串常量可以用字符型指针变量指向它。将指针变量指向字符串常量的

8、方法有两种:法一char *p=Hello;法二 char *p; p=Hello; 上述两种方法的含义均是:先让字符串常量占据连续空间,再将该空间的首地址赋值给指针变量。以后就可以使用该指针变量来处理字符串或字符串中的单个字符了。3)使用字符指针和字符数组处理字符串的区别先看以下几组对比程序段:(1)char *p; char a10; strcpy(p, Hello); strcpy(a, Hello); 前者错,因为p未指向任何合法空间,就用strcpy函数给p所指空间赋值是危险的。后者是正确的,但要注意,在定义时要使数组具有足够的存储空间。(2)char *p; char a10; p

9、=Hello; a=Hello; 后者错,因为a是数组名,是数组首地址,是常量,不可以出现在赋值号左边。前者是正确的,先让字符串常量占据合法的连续空间,再将该空间的首地址赋值给指针变量。(3)char *p, a10; char a10;p=a; strcpy(a, Hello); strcpy(p, Hello); 二者都正确,完全等价,都是将字符串常量赋值给数组a对应的空间,前者只是先让p指向数组a对应的空间。(4)char *p, a10; char a10;p=a; strcpy(a, Hello); p=Hello; 虽然二者都正确,但后者是将字符串常量赋值给数组a对应的空间,前者只

10、是先让p指向数组a对应的空间,然后让字符串常量占据另外合法的连续空间,再将该合法空间的首地址赋值给p,此时p已不指向数组a了。2.2 二维数组及指针1)二维数组的含义一个二维数组可以看成若干个一维数组。例如,有定义:int a23;,可以看成是2个长度为3的一维数组,这2个一维数组的名字分别为a0、a1。其中名为a0的一维数组元素有a00、a01、a02;名为a1的一维数组元素有a10、a11、a12。2)指向二维数组的指针设有如下定义和赋值:int a43=1,2,3,4,5,6,7,8,9,10,11,12; int *p, (*q)3; p=&a00; q=a;则有下列存储关系: p p

11、+1 q 地址 101 103 105123456789101112 q+3由于C语言允许将一个二维数组分解为多个一维数组来处理。因此数组a可分解为四个一维数组,即a0、a1、a2、a3,每一个一维数组又含有三个元素,因此,a0、a1、a2、a3是一维数组的名字,是对应一维数组的首地址。而C语言规定,数组名就是数组的首地址,因此,a是二维数组的首地址。&a00即p显然也是二维数组的首地址,那么与a有什么区别呢?二者的值相等,根据上图的假设,地址值均为101,但p+1指向下一个元素a01,值为103,而a+1指向下一行,值为107。由此,我们通常将p称为列指针(同指向变量的指针),a称为行指针。

12、但是a是数组名,是常量,于是,可以按如下格式定义一个二维数组对应的行指针变量:类型说明符 (*指针变量名)所指二维数组的第二维长度值;例如,上例中的q就是一个可以指向a的行指针变量。3)二维数组元素的引用设有上例的定义和赋值,则二维数组元素的引用如下:下标法列指针表示行指针表示a00*p或p0*q或*(*(q+0)+0)或q00a01*(p+1)或p1*(*(q+0)+1) 或q01a02*(p+2)或p2*(*(q+0)+2) 或q02aij*(p+i*3+j)或pi*3+j*(*(q+i)+j) 或qija32*(p+11)或p11*(*(q+3)+2) 或q32【识别技巧】由上图可以发现

13、:行指针加上一个*或一个即为列指针,列指针加上一个*或一个即为二维数组的一个元素。反之,二维数组的元素去掉一个*或去掉一个或加上一个&即为列指针,列指针去掉一个*或去掉一个或加上一个&即为行指针。例如:(07秋)26若有声明“int a34,*p=a0,(*q)4=a;”,则下列叙述中错误的是_。 Aa23与q23等价 Ba23与p23等价 Ca23与*(p+11)等价 Da23与p=p+11,*p等价显然只有B是错误的,因为p是列指针,不可以加两个 ,有了上述技巧,本题一眼就能看穿。3. 函数3.1 参数处理顺序 所有函数的参数处理顺序都是从右至左的,输出时仍按各参数原有次序显示在屏幕上。例1:有如下程序段:int a=3;printf(%d,%dn,a,+a);显示结果为:4,4(而不是3,4)。例2:(2001春

展开阅读全文
相关资源
相关搜索

当前位置:首页 > IT计算机/网络 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号