




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言程序设计课程教案表授课题目第F基本数据类型和表达式(3)课时安排2授课时间1 .掌握:指针运算2 . 了解:位运算符及逗号运算符教学内容1 .基本内容:(1)指针运算(2)其他运算符及表达式2 .重点:指针变量的定义与应用、指针运算3 .难点:指针运算讲课进程和时间分配1、地址与指针的概念(15分钟)(1)变量的指针与变量的值1)地址:在计算机中,把内存区划分为一个一个的存储单元,每个单元为一个字节(8位),它们都有一个编号,这个编号就是内存地址一个字节低地址3U0高地见2002200324板书上面这个图,以便使学生更好地理解内存地址。如有定义:char c= A ; int a=3;则
2、所占内存情况如下:c 占字节, 存放的 是父的 ASC工工百马起占两个 字节 低字节 存放低8 位孑高 字节存 放高守位O1OOOOO100000003低字节OOOOOOCO高字节注意:c和a的地址可能相邻,也可能不相邻,是由系统分配的,我们不用关心。【例2.11输出变量的值和变量的指针(地址)。main()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 ”
3、 ,a,b,c,d,e,f);输出结果:12,20懂叶俚址)即存字节敏度量名际0口102蔓出B0Q如2hE55041C心5 05Y1d655065.64e烟加工修4f图2-8变量与地址通过上述例题,使学生区分变量的值和变量地址(指针)两个专业术语。(2)变量的指针和指针变量C语言中一个变量所分配的内存空间首字节地址,称为该变量的指针(地址)。一个指针变量的值是存放另一个变量的地址。例如:int a=10,*p;p=&a;将变量a的地址赋给指针变量 p,如图2-9所示。图2-9指针变量举例2、指针变量的定义与引用(20分钟)(1)指针变量的定义指针变量的定义格式:数据类型*标识符 ;说明:“*表
4、示该变量为一个指针变量。标识符为指针变量名,取名规则与一般变量取名规则相同。例:int *p1 ;/*定义pl为指向整型变量的指针变量*/char *c1 ;/*定义 cl为指向字符型变量的指针变量*/float *f1 ;/*定义fl为指向实型变量的指针变量*/以上定义的3个指针变量,其中,pl可以存放整型变量的地址;cl存放字符型变量的地址;fl存放实型变量的地址。(2)与指针有关的两个运算1) &取地址运算符作用:取变量内存单元的地址。取变量地址的运算符“&在前面输入语句时已经使用过。如:scanf( d ,&a);/*变量a的地址中输入数据 */一个指针变量只能指向其定义中所说明的数据
5、类型。例:int a,*p1 ;char c,*c1;p1=&a ;/*把变量a的地址赋给指针变量pl */c1=&c;/*把变量c的地址赋给指针变量cl */以上定义的pl、cl两个指针变量,pl的值是变量a的指针;cl的值是变量c的指针。2) *取内容运算符作用:取指针变量所指变量的值,又称间接访问运算符考虑:存储单元的地址与变量间有什么样的关系?看下面例子:用现实生活中的例子使学生更好地理解上述问题,并找到两者之间联系。主任办公室书记办公室教学秘书办公室201202203此处房间相当于存储单元、房间号相当于地址、主任办公室”等相当于变量名。因此,对存储单元的访问,既可以通过变量名来实现,
6、也可以通过地址来访问。结论:对一个变量的访问(访问是指存、取其值或赋值等操作)有两种方式:直接访问间接访问直接访问:即直接通过变量名所对应的地址访问数据。例:main()int a=5;printf( a=%d n” ,a);运行结果:a=5通过变量名a与地址的对应关系,找到a的地址,然后从地址中取出数据5输出间接访问:即通过一个指针变量来访问数据。间接访问即先把某一变量的地址保存在一个指针变量中,若对该变量的数据进行操作,先要找到保存该变量地址的指针变量,然后从指针变量中取出保存的地址,再从地址中取出数据进行运算。例:main()int a=10,*p;p=&a ;/*将变量a的地址赋给指针
7、变量p */printf( a=%d n,*p) ; /* *p 是取出p所指向的变量 a的地址65500中的值*/运行结果:a=10(3)指针变量的定义与引用指针变量的初始化的一般格式如下:数据类型*标识符=&变量名;例:int a,*p=&a ;指针变量初始化的过程是:系统按照所定义的类型,在内存中为变量a与指针变量p分配存储空间。同时,将变量a的地址送给指针变量 p中。在上面的定义中,p指向a。定义指针变量的目的是,为了通过指针变量去引用(访问)内存单元。当一个指针变量 得到一个变量的地址后,就可以用指针对变量进行操作。【例2.12】用两种方式输出变量的值。main()int a=10,
8、b=20;int *p1=&a ; /*指针变量的初始化 */int *p2=&b ;printf( a=%d n,a,b)printf( *p1=%d,*p2=%nd *p1,*p2) 运行:a=10,b=20*p1=10,*p2=20分析结果:第一个打印语句printf(a=%dn,a,b)是用直接方式输出。第二个printf( *p1=%d,*p2=%d *p1,*p2)是用间接访问方式输出,其执行过程是:a的地址赋给指针变量pl, b的地址赋给指针变量p2o pl指向a,p2指向b(如图2-11所示)。*p1和*p2是分别从其内存单元中取出的值65500和65502。然后,从地址 65
9、500、65502中分别取出值10、20输出。以上表明:当p1=&a;则p1的值是a的地址;*p1是a的值,即*p1与a等价。对某一 个变量进行运算,可以用两种方法来进行 :用变量名;用指针运算符 “*;取指针变量所 指变量的值。【例2.13】分析程序运行结果。main()int a=10,b=8,c,d,*p1,*p2 ;p1=&a;p2=&b ;c=*p1+*p2 ;d=*p1-*p2 ;Printf(a a+b=%d ,c)Printf(a n ,d) 运行结果:a+b=18a-b=2说明:p1的值是a的地址,*p1是取p1所指变量的值,即 a的值,所以*p1与a等价。 同理,*p2与b
10、等价。所以有:c=*p1+*p2 与c=a+b等价;c=*p1-*p2与c=a-b等价。 3、指针运算(20分钟)指针运算就是地址运算 。(1)指针的算术运算1)指针加、减整数的运算设:p为指针变量,n为正整数。则表达式 p+n,为p的当前值后面第n项数据的地址。p+n与p之间有多少个单元,与p所指向的数据类型有关。如int型变量在内存占2个字节,若p为指向int型变量,p+,指针自动向后移动 2个字节,p+2则向后移动4个字节。同理, 表达式p-n为p的当前值前移第n项数据的地址,-p,则p前移动2个字节。因此,p+n是按数据类型存储单元比例增大,而不是直接加no所以有:int a,*p1;
11、 p1=&a;char c,*pc;pc=&c;float f,*fp;fp=&f;p1+2;pc+2;pf+2;/*p1向后移动 /*pc向后移动 /*pf向后移动4个字节*/2个字节*/8个字节*/同理:p1-3;/*p1向前移动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个
12、字节,然后取p的当前值。* (-p)指针向前移动2个字节,然后取p的当前值。指针向前(-)或向后(+)移动的字节数,与定义的指针类型有关。(2)指针的赋值运算可以把一个变量的地址赋值给一个指针变量,或者将一个有确定指向的指针变量的值,赋给另一个相同类型的指针变量。如:int a,b,*p1,*p2; /* 定义2个整型变量及2个指向整型变量的指针变量 */p1=&a;/*变量a的地址赋给 pl */p2=p1;/* pl的值赋给p2,即p1,p2同时指向变量 a */(3)指针的关系运算指向同类型的两个指针pl与p2,如,pl值所表示的地址码在 p2值所表示的地址码之前时,表达式p1p2的值为
13、1。指针与一般的整型数据的比较无意义。注:“&取地址符号不能用于常量或表达式,因为它们没有地址。 符号“*的两种用途:当“*出现在变量的定义位置,表示定义指针变量;当出现在语句行中,是取指针变量所指变量的值,又称间接访问运算符。这是初学者容易迷惑的地方。4、位运算符(15分钟)位(bit)运算使C语言具备了部分低级语言的特征和功能。位运算可直接对内存的基 本单位字节”(byte)按二进制进行控制和操作。位运算符共有6个:1.按位与(&) 2.按位或(|) 3.按位异或(A) 4.按位求反()5.左移()6.右移( ),由于位操作是按二进制进行运算,所以运算量一般为无符号整 型或字符型。操作数可
14、以是常量、变量或表达式 。(1)按位与(&)操作规则:参加运算的两个运算量,如果两个相应的位均为1,则该位的结果为 1,否则为0。即:0&0=00&1=01&0=01&1=1例如:01000001&01000010(按位与 &)01000000 (结果)按位与的主要用途为:1)清零。要将一个运算量的每个位清零(屏蔽),例如a的值为1101101, b的值为11110000, a&b的结果是11010000,相当于把 a的低4位屏蔽,高4位不变。2)取一个数中的某些位。若要把某数的某些二进制位取出来,可以把其它位清零,把 需要取出的位作按位与即可。(2)按位或|操作规则:参加运算的两个运算量,其
15、相应的位中只要有一个为1,则该位的结果为1,否则为0。即:0|0=00|1=11|0=11|1=1 例如:01000001I 01000010(按位或 |)01000011 (结果)按位或常用来对一个数的某些位置为1。一个数为a,要将其低字节全置为1,即低字节为11111111,可将t数与255 (十六进制为FF,二进制为11111111)按位或即可。(3) 按位异或(A)操作规则:参加运算的两个运算量,当相应位相同时,其结果在该位为0,相应位不同时,其结果在该位为1,即按位相加,但不进位。即:0A 0=00A 1=11 A 0=11 A 1=0例如:01000001一01000010 (按位
16、异或A)00000011 (结果)按位异或的主要用途为:使指定位翻转。即由1变为0,由0变为1。如:要对011100110的低4位翻转,将其与 00001111按位异或即可。01100110丛_00001111 (按位异或A )01101001 (结果)可以看到,凡是与1异或的都变反了,而与 0异或的位原封不动。2)不使用临时变量,交换两个值。方法为:若有两个数 a=3,二进制二(011)和b=4,二进制(100),通过下面的赋值语句可 将a和b的值互换:a=aAb; /* a=(011 A 100)=111*/b=bA a; /*b=(100 A 111)=011, b=3*/a=aA b;
17、 /*a=(111 A 011)=100 , a=4*/3)与0相八,保留原值。(4)按位求反()操作规则:运算符是一个单目运算符,用来对一个数的二进制表示按位求反,即将0变成1,将1变成0。0 = 11 = 0(5)左移()操作规则:将一个数的各二进制位全部左移若干位,左移后,右边的这些位用0填补,左边移出的位舍弃不用。运算符右边的表达式表示向左移位的位数。例如:a=a2;若a=15,即二进制00001111,左移两位后变为:00111100后赋值2a a。左移可以扩大原数的倍数。即:将一个数左移1位,相当于该数乘以2;左移2位相当于该数乘以4。如上例中a=15,则a=a)操作规则:将一个数
18、的各二进制位全部右移若干位,运算符右边的表达式表示向右移位的位数。右移后,右边移出的位被舍弃,而左边的填补分两种情况: 该数为无符号数,则高位补0。例如:a=a2;若a=15,二进制为 00001111,右移2位后为00000011。该数为有符号数,若原来的符号位为0 (最高位为0,即正数),则高位补0,如上例所示。若原来的符号位为1 (即该数为负数),高位补0或1,取决于所使用的计算机系统。有的系统补0,称为逻辑右移;有的系统补1,称为算术右移。5、逗号运算符(15分钟)逗号运算符为;”。逗号表达式是用逗号运算符把两个表达式组合成的一个表达式。其一般形式为:表达式1,表达式2说明: (1)逗号表达式的执行过程是:先求表达式1的值,再求表达式 2的值,表达式2的值就是整 个逗号表达式的值。例如:a=8, a+10;先对a=8进行处理,然后计算 a+10,因此上述表达式执行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业园区规划设计与质量监管策略
- 工业机器人市场及技术发展趋势
- 工业机器人技术与应用趋势
- 工业机器人技术及应用领域探讨
- 工业废物处理与循环经济
- 工业自动化中机器视觉的发展趋势
- 工业污染防治技术
- 工业绿色化改造的实践与思考
- 工业质量管理与质量控制方法探讨
- 工业自动化技术的应用与发展趋势
- DB3307-T 119 -2021 金华地方传统小吃 永康肉麦饼
- 中医病证诊断疗效标准
- WS 10012-2023 地方性砷中毒病区判定和划分代替WS 277-2007
- 【模板】纯化水微生物限度检查法验证报告
- 样品管理程序检验科程序文件
- 04D701-3 电缆桥架安装
- 叉车操作安全规范(图片版)课件
- 前置胎盘临床诊断与处理指南课件
- 《Python程序设计(第3版)》完整版PDF
- 15D501建筑物防雷设施安装图集
- 房屋安全简易鉴定表
评论
0/150
提交评论