《《C语言程序设计 》教案 第二章 基本数据类型和表达式.doc》由会员分享,可在线阅读,更多相关《《C语言程序设计 》教案 第二章 基本数据类型和表达式.doc(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C语言程序设计课程教案表授课题目第二章 基本数据类型和表达式(3)课时安排2授课时间教学目的和要求1掌握:指针运算2了解:位运算符及逗号运算符教学内容1基本内容:(1)指针运算(2)其他运算符及表达式2重点:指针变量的定义与应用、指针运算3难点:指针运算讲课进程和时间分配、地址与指针的概念 (15分钟)(1)变量的指针与变量的值1)地址:在计算机中,把内存区划分为一个一个的存储单元,每个单元为一个字节(位),它们都有一个编号,这个编号就是内存地址板书上面这个图,以便使学生更好地理解内存地址。如有定义:char c=A; int a=3; 则所占内存情况如下: 注意:c和a的地址可能相邻,也可能
2、不相邻,是由系统分配的,我们不用关心。【例2.11】输出变量的值和变量的指针(地址)。main()201202203主任办公室书记办公室秘书办公室 int a=10,b=20; char c=X,d=Y; float e=5.6,f=-2.8; printf(“%d,%dn”,a,b); printf(“%c,%cn”,c,d); printf(“%f,%fn”,e,f); printf(“%p,%p,%p,%p,%p,%pn”,a,b,c,d,e,f); 输出结果:12,20通过上述例题,使学生区分变量的值和变量地址(指针)两个专业术语。(2)变量的指针和指针变量C语言中一个变量所分配的内存
3、空间首字节地址,称为该变量的指针(地址)。一个指针变量的值是存放另一个变量的地址。例如: int a=10,*p; p=&a; 将变量a的地址赋给指针变量p,如图2-9所示。 2、指针变量的定义与引用 (20分钟)(1)指针变量的定义指针变量的定义格式:数据类型 *; 说明:“*”表示该变量为一个指针变量。为指针变量名,取名规则与一般变量取名规则相同。例 :int *p1; /*定义p1为指向整型变量的指针变量*/ char *c1; /*定义c1为指向字符型变量的指针变量*/ float *f1; /*定义f1为指向实型变量的指针变量*/以上定义的3个指针变量,其中,p1可以存放整型变量的地
4、址;c1存放字符型变量的地址;f1存放实型变量的地址。(2)与指针有关的两个运算1) & 取地址运算符作用:取变量内存单元的地址。取变量地址的运算符“&”在前面输入语句时已经使用过。如:scanf(“%d”,&a);/*向变量a的地址中输入数据 */ 一个指针变量只能指向其定义中所说明的数据类型。例:int a,*p1; char c,*c1; p1=&a; /*把变量a的地址赋给指针变量 p1 */ c1=&c; /*把变量c的地址赋给指针变量 c1 */以上定义的p1、c1两个指针变量,p1的值是变量a的指针;c1的值是变量c的指针。2) * 取内容运算符 作用:取指针变量所指变量的值,又
5、称间接访问运算符考虑:存储单元的地址与变量间有什么样的关系?看下面例子:用现实生活中的例子使学生更好地理解上述问题,并找到两者之间联系。主任办公室 书记办公室 教学秘书办公室201 202 203此处房间相当于存储单元、房间号相当于地址、“主任办公室”等相当于变量名。因此,对存储单元的访问,既可以通过变量名来实现,也可以通过地址来访问。结论:对一个变量的访问(访问是指存、取其值或赋值等操作)有两种方式:直接访问间接访问直接访问:即直接通过变量名所对应的地址访问数据。例:main() int a=5; printf(“a=%dn”,a); 运行结果:a=5 通过变量名a与地址的对应关系,找到a的
6、地址,然后从地址中取出数据5输出间接访问:即通过一个指针变量来访问数据。间接访问即先把某一变量的地址保存在一个指针变量中,若对该变量的数据进行操作,先要找到保存该变量地址的指针变量,然后从指针变量中取出保存的地址,再从地址中取出数据进行运算。例:main() int a=10,*p; p=&a; /* 将变量a的地址赋给指针变量p */ printf(“a=%dn”,*p);/* *p是取出p所指向的变量a的地址65500中的值*/ 运行结果:a=10 (3)指针变量的定义与引用指针变量的初始化的一般格式如下:数据类型 *=&变量名;例:int a,*p=&a; 指针变量初始化的过程是:系统按
7、照所定义的类型,在内存中为变量a与指针变量p分配存储空间。同时,将变量a的地址送给指针变量p中。在上面的定义中,p指向a。 定义指针变量的目的是,为了通过指针变量去引用(访问)内存单元。当一个指针变量得到一个变量的地址后,就可以用指针对变量进行操作。【例2.12】用两种方式输出变量的值。 main() int a=10,b=20; int *p1=&a;/*指针变量的初始化*/ int *p2=&b; printf(“a=%d,b=%dn”,a,b); printf(“*p1=%d,*p2=%dn”*p1,*p2); 运行: a=10,b=20*p1=10,*p2=20分析结果:第一个打印语句
8、printf(“a=%d,b=%dn”,a,b);是用直接方式输出。第二个printf(“*p1=%d,*p2=%dn”*p1,*p2);是用间接访问方式输出,其执行过程是: a的地址赋给指针变量p1,b的地址赋给指针变量p2。p1指向a,p2指向b(如图2-11所示)。*p1和*p2是分别从其内存单元中取出的值65500和65502。然后,从地址65500、65502中分别取出值10、20输出。以上表明:当p1=&a;则p1的值是a的地址;*p1是a的值,即*p1与a等价。对某一个变量进行运算,可以用两种方法来进行:用变量名;用指针运算符“*”,取指针变量所指变量的值。【例2.13】分析程序
9、运行结果。 main() int a=10,b=8,c,d,*p1,*p2; p1=&a;p2=&b; c=*p1+*p2; d=*p1-*p2; Printf(“a+b=%dn”,c); Printf(“a-b=%dn”,d); 运行结果:a+b=18 a-b=2说明:p1的值是a的地址,*p1是取p1所指变量的值,即a的值,所以*p1与a等价。同理,*p2与b等价。所以有:c=*p1+*p2与c=a+b等价;c=*p1-*p2与c=a-b等价。 3、指针运算 (20分钟)指针运算就是地址运算。(1)指针的算术运算1)指针加、减整数的运算 设:p为指针变量,n为正整数。则表达式p+n,为p的
10、当前值后面第n项数据的地址。p+n与p之间有多少个单元,与p所指向的数据类型有关。如int型变量在内存占2个字节,若p为指向int型变量,p+,指针自动向后移动2个字节,p+2则向后移动4个字节。同理,表达式p-n为p的当前值前移第n项数据的地址,-p,则p前移动2个字节。 因此,p+n是按数据类型存储单元比例增大,而不是直接加n。所以有: int a,*p1; p1=&a; char c,*pc;pc=&c; float f,*fp;fp=&f;p1+2; /*p1向后移动4个字节*/ pc+2; /*pc向后移动2个字节*/ pf+2; /*pf向后移动8个字节*/同理:p1-3; /*p
11、1向前移动6个字节*/ pc-2; /*pc向前移动2个字节*/ pf-2; /*pf向前移动8个字节*/两个指针相加无意义2)指针变量自加自减运算 仍设p为指向int 型的指针变量。下面由运算符+、-作用于指针p,构成4个表达式。 *p+ 取p的当前值,然后p=p+1,即指针向后移动2个字节。 *p- 取p的当前值,然后p=p-1, 即指针向前移动2个字节。 *(+p)指针向后移动2个字节,然后取p的当前值。 *(-p)指针向前移动2个字节,然后取p的当前值。 指针向前(-)或向后(+)移动的字节数,与定义的指针类型有关。(2)指针的赋值运算可以把一个变量的地址赋值给一个指针变量,或者将一个
12、有确定指向的指针变量的值,赋给另一个相同类型的指针变量。如:int a,b,*p1,*p2; /* 定义2个整型变量及2个指向整型变量的指针变量*/p1=&a; /* 变量a的地址赋给p1 */p2=p1; /* p1的值赋给p2 ,即p1,p2同时指向变量a */(3)指针的关系运算指向同类型的两个指针p1与p2,如,p1值所表示的地址码在p2值所表示的地址码之前时,表达式p1p2的值为1。指针与一般的整型数据的比较无意义。注:“&”取地址符号不能用于常量或表达式,因为它们没有地址。符号“*”的两种用途:当“*”出现在变量的定义位置,表示定义指针变量;当出现在语句行中,是取指针变量所指变量的
13、值,又称间接访问运算符。这是初学者容易迷惑的地方。4、位运算符 (15分钟)位(bit)运算使C语言具备了部分低级语言的特征和功能。位运算可直接对内存的基本单位“字节”(byte)按二进制进行控制和操作。 位运算符共有6个: 1.按位与(&) 2.按位或(|) 3. 按位异或() 4.按位求反() 5.左移(),由于位操作是按二进制进行运算,所以运算量一般为无符号整型或字符型。操作数可以是常量、变量或表达式 。(1)按位与(&) 操作规则:参加运算的两个运算量,如果两个相应的位均为1,则该位的结果为1,否则为0。即: 0&0=0 0&1=0 1&0=0 1&1=1 例如: & (按位与&) (
14、结果) 按位与的主要用途为: 1)清零。要将一个运算量的每个位清零(屏蔽),例如a的值为,b的值为,a&b的结果是,相当于把a的低4位屏蔽,高4位不变。 2)取一个数中的某些位。若要把某数的某些二进制位取出来,可以把其它位清零,把需要取出的位作按位与即可。(2)按位或| 操作规则:参加运算的两个运算量,其相应的位中只要有一个为1,则该位的结果为1,否则为0。即: 0|0=0 0|1=1 1|0=1 1|1=1 例如: | (按位或|) (结果) 按位或常用来对一个数的某些位置为1。一个数为a,要将其低字节全置为1,即低字节为,可将该数与255(十六进制为FF,二进制为)按位或即可。 (3) 按
15、位异或()操作规则:参加运算的两个运算量,当相应位相同时,其结果在该位为0,相应位不同时,其结果在该位为1,即按位相加,但不进位。即:00=0 01=1 10=1 11=0 例如: (按位异或) (结果) 按位异或的主要用途为: 使指定位翻转。即由1变为0,由0变为1。如:要对的低4位翻转,将其与按位异或即可。 (按位异或) (结果) 可以看到,凡是与1异或的都变反了,而与0异或的位原封不动。2)不使用临时变量,交换两个值。 方法为:若有两个数a=3,二进制=(011)和b=4,二进制(100),通过下面的赋值语句可将a和b的值互换: a=ab; /* a=(011100)=111 */ b=
16、ba; /*b=(100111)=011,b=3 */ a=ab; /*a=(111011)=100,a=4 */ 3)与0相,保留原值。(4)按位求反()操作规则:运算符是一个单目运算符,用来对一个数的二进制表示按位求反,即将0变成1,将1变成0。 0 = 1 1 = 0(5)左移() 操作规则:将一个数的各二进制位全部左移若干位,左移后,右边的这些位用0填补,左边移出的位舍弃不用。运算符右边的表达式表示向左移位的位数。 例如:a=a2;若a=15,即二进制,左移两位后变为: 后赋值给a。 左移可以扩大原数的倍数。即:将一个数左移1位,相当于该数乘以2;左移2位相当于该数乘以4。如上例中a=
17、15,则a=a)操作规则:将一个数的各二进制位全部右移若干位,运算符右边的表达式表示向右移位的位数。右移后,右边移出的位被舍弃,而左边的填补分两种情况:该数为无符号数,则高位补0。 例如:a=a2;若a=15,二进制为,右移2位后为。该数为有符号数,若原来的符号位为0(最高位为0,即正数),则高位补0,如上例所示。若原来的符号位为1(即该数为负数),高位补0或1,取决于所使用的计算机系统。有的系统补0,称为逻辑右移;有的系统补1,称为算术右移。5、逗号运算符 (15分钟)逗号运算符为“,”。逗号表达式是用逗号运算符把两个表达式组合成的一个表达式。其一般形式为: 表达式1,表达式2 说明:(1)
18、逗号表达式的执行过程是:先求表达式1的值,再求表达式2的值,表达式2的值就是整个逗号表达式的值。 例如:a=8,a+10;先对a=8进行处理,然后计算a+10,因此上述表达式执行完后,a的值为8,而整个表达式的值为18。(2)一个逗号表达式可以与另一个表达式构成一个新的逗号表达式。 例如:(a=2*8,a*5),a+10构成一个逗号表达式,先计算a=2*8的值,a=16,然后再计算a*5=80。(a=2*8,a*5)的值为80,最后计算a+10,此时a的值没有变,仍为16,那么逗号表达式(a=2*8,a*5),a+10的值为a+10的值,即为26。(3)逗号运算符是所有运算符中级别最低的。【例
19、2.14】分析程序运行结果。 main() int x,y; x=50; y=(x=x-5,x/5) /* x的初值=50,减5后为45,再被5除,所以y=9 */ printf(“y=%dn”,y); 运行结果:y=9使用逗号表达式的目的仅仅是为了得到各个表达式的值,如,可用如下逗号表达式语句交换 a和b两个变量中的数值:t=a,a=b,b=t;等价于:t=a;a=b;b=t;注意:逗号表达式常用于for语句中,它可以表达多个初值或多个步长增量。逗号运算符不要随意乱用,特别容易出错。6、总结 (5分钟)讨论、思考题、作业:实验指导书习题参考资料(含参考书、文献等):叶斌 陈世强. C语言程序设计. 北京:科学出版社授课类型:理论课 讨论课 实验课 练习课 其他教学方式:传统授课 双语 讨论 示教 指导 其他教学资源:多媒体 模型 实物 挂图 音像 其他