c语言论文优选九篇

时间:2022-11-19 08:47:21

引言:易发表网凭借丰富的文秘实践,为您精心挑选了九篇c语言论文范例。如需获取更多原创内容,可随时联系我们的客服老师。

c语言论文

第1篇

参考文献:

[1]裘宗燕.C++程序设计语言(特别版).北京机械工业出版社,2002.7.

[2]StandleyB.lippman.C++Primer中文版.人民邮电出版社,20006.3.

[3]谭浩强.C程序设计(第二版).清华大学出版社出版,2005.6.

[4]钱能.C++程序设计教程.清华大学出版社,2005.5.

[5]沈美明.IBMPC汇编语言程序设计.清华大学出版社,1993.9.

[6]钱晓捷.汇编语言程序设计.电子工业出版社,2003.

【参考文献】

[1]翟乃强,隋树林,汇编语言与C语言及VisualC++混合编程[J].青岛科技大学学报,2003,24(B09):136~138.

[2]钱晓捷,汇编语言程序设计(第二版)[M],电子工业出版社,2003.6.

[3]钱春英,浅谈C语言与汇编语言混合编程的一些技术[J].南通航运职业技术学院学报,2005,4(1):50~52,55.

[4]郭晓梅,汇编语言与C语言的混合编程及应用[J].南京农专学报,2002,18(4):49~52,62.

[5]普拉塔.CPrimerPlus(第五版)中文版[M].人民邮电出版社,2005.

[6]斯马尔迪诺.教学技术与媒体[M].高等教育出版社,2008.

[7]教育部考试中心.全国计算机等级考试二级教程——C语言程序设计[M].2010年版.北京:高等教育出版社,2010.

参考文献:

[1]周以真.计算思维[J].中国计算机学会通讯,2007,(3):77-79.

[2]董荣胜.计算思维与计算机导论[J].计算机科学,2009,(36):50-52.

[3]林旺.孙洪涛[J].基于软件应用的计算思维能力培养教学设计.中国电化教育2014,(11):122-127.

第2篇

关键词FranklinC51编译器汇编语言结构化设计模块中断

--------------------------------------------------------------------------------

在研制单片机应用系统时,汇编语言是一种常用的软件工具。它能直接操作硬件,指令的执行速度快。但其指令系统的固有格式受硬件结构的限制很大,且难于编写与调试,可移植性也差。随着单片机硬件性能的提高,其工作速度越来越快,因此在编写单片机应用系统程序时,更着重于程序本身的编写效率。而FranklinC51交叉编译器是专为80C51系列单片机设计的一种高效的C语言编译器,使用它可以缩短开发周期,降低开发成本,而且开发出的系统易于维护,可靠性高,可移植性好,即使在代码的使用效率上,也完全可以和汇编语言相比,因此目前它已成为开发80C51系列单片机的流行工具。

1C51语言程序设计的基本技巧

C语言是一种高级程序设计语言,它提供了十分完备的规范化流程控制结构。因此采用C51语言设计单片机应用系统程序时,首先要尽可能地采用结构化的程序设计方法,这样可使整个应用系统程序结构清晰,易于调试和维护。对于一个较大的程序,可将整个程序按功能分成若干个模块,不同的模块完成不同的功能。对于不同的功能模块,分别指定相应的入口参数和出口参数,而经常使用的一些程序最好编成函数,这样既不会引起整个程序管理的混乱,还可增强可读性,移植性也好。

在程序设计过程中,要充分利用C51语言的预处理命令。对于一些常用的常数,如TRUE,FALSE,PI以及各种特殊功能寄存器,或程序中一些重要的依据外界条件可变的常量,可采用宏定义"#define"或集中起来放在一个头文件中进行定义,再采用文件包含命令"#include"将其加入到程序中去。这样当需要修改某个参量时,只须修改相应的包含文件或宏定义,而不必对使用它们的每个程序文件都作修改,从而有利于文件的维护和更新。现举例说明如下:

例1对于不同的单片机晶振,程序取不同的延时时间,而且可根据外界条件的变化修改延时时间的长短。对于这样的程序,可利用宏定义和条件编译来实现。程序如下:

#defineflag1

#ifdefflag==1

#definefosc6M

delay=10;

#elifflag==0

#definefosc8M

delay=12;

#else

#definefosc12M

delay=20;

#endif

main()

{

for(I=0;I<delay;I++);

}

这样源程序不作任何修改就可适用于不同时钟频率的单片机系统,并可根据情况的不同取不同的delay值,完成不同的目的。

2C51语言与汇编语言程序的混合编程

C51编译器能对C语言源程序进行高效率的编译,生成高效简洁的代码,在绝大多数场合采用C语言编程即可完成预期的目的。但有时为了编程直观或某些特殊地址的处理,还须采用一定的汇编语言编程。而在另一些场合,出于某种目的,汇编语言也可调用C语言。在这种混合编程中,关键是参数的传递和函数的返回值。它们必须有完整的约定,否则数据的交换就可能出错。下面就以力源公司的10位串行A/D转换器TLC1549为例说明C语言程序与汇编语言程序的调用。

图1TLC1549管脚图

1549的管脚图和时序图分别如图1和图2所示,假定DATAOUT接P1.0,接P1.1,CLOCK接P1.2。

1549的具体特性请查阅有关资料。

例2C语言程序与汇编语言程序的调用,其子程序如下:

PUBLICAD;入口地址

SEG_ADSEGMENTCODE;程序段

RSEGSEG_AD

USING0

AD:MOVR6,#00

MOVR7,#00

SETBP1.1

ACALLDELAY

CLRP1.1

ACALLDELAY

MOVR0,#10

RR0:SETBP1.2

NOP

CLRP1.2

DJNZR0,RR0

ACALLDELAY

MOV30H,R6;A/D转换的高

;两位保存在R6中

ACALLCIR

MOVR6,30H

SETBP1.2

NOP

CLRP1.2

MOV30H,R6

ACALLCIR

MOVR6,30H

MOVR0,#8;A/D转换的低

;8位保存在R7中

RR2:SETBP1.2

NOP

CLRP1.2

MOV30H,R7

ACALLCIR

MOVR7,30H

DJNZR0,RR2

RET

CIR:CLRC

MOVC,P1.0

MOVA,30H

RLCA

MOV30H,A

RET

END

在以上程序中,函数的返回值为一无符号整型数,根据调用规则,返回值的高位必须在R6中,低位在R7中,这样才可保证数据的传递不出错。另外,在调用过程中,必须注意寄存器的入栈。这样在以后用到A/D转换时,在C语言中调用汇编语言子程序AD()即可。

3C51中断处理过程

C51编译器支持在C源程序中直接开发中断过程,因此减轻了使用汇编语言的繁琐工作,提高了开发效率。中断服务函数的完整语法如下:

void函数名(void)[模式]

[再入]interruptn[usingr]

其中n(0~31)代表中断号。C51编译器允许32个中断,具体使用哪个中断由80C51系列的芯片决定。r(0~3)代表第r组寄存器。在调用中断函数时,要求中断过程调用的函数所使用的寄存器组必须与其相同。"再入"用于说明中断处理函数有无"再入"能力。C51编译器及其对C语言的扩充允许编程者对中断所有方面的控制和寄存器组的使用。这种支持能使编程者创建高效的中断服务程序,用户只须在C语言下关心中断和必要的寄存器组切换操作。

例3设单片机的fosc=12MHz,要求用T0的方式1编程,在P1.0脚输出周期为2ms的方波。

用C语言编写的中断服务程序如下:

#include<reg51.h>

sbitP1_0=P1^0;

voidtimer0(void)interrupt1using1{

/*T0中断服务程序入口*/

P1_0=!P1_0;

TH0=-(1000/256);/*计数初值重装*/

TL0=-(1000%256);

}

voidmain(void)

{

TMOD=0x01;/*T0工作在定时器方式1*/

P1_0=0;

TH0=-(1000/256);/*预置计数初值*/

TL0=-(1000%256);

EA=1;/*CPU开中断*/

ET0=1;/*T0开中断*/

TR0=1;/*启动T0*/

do{}while(1);

}

在编写中断服务程序时必须注意不能进行参数传递,不能有返回值。

第3篇

为了激发学生的兴趣,可以采用Funcode平台进行课程设计。Funcode平台是一款基于游戏设计和动画界面的C\C++\Java综合实验教学平台,该平台以游戏设计为“噱头”,吸引学生的学习兴趣,虽然如此,该平台通过精选大量的游戏案例,还是很好地将程序设计知识点和游戏设计紧密地结合起来,始终紧扣C语言知识点,为C语言课程设计教学提供了一个很好的工具。

1.1图形方式的游戏界面编辑Funcode平台采用图形界面方式的游戏编辑环境,直观、美观、简洁易用。图1所示为正在设计中的游戏,左侧矩形框中为最终运行时可见的游戏界面,可以从右侧中的“鱼”(Funcode中称为“精灵”,任何类似的图片都是精灵,不同的精灵以精灵名区分)中任意拖拽一条“鱼”到左侧矩形框中,即可在游戏界面中增加一条鱼。

1.2提供功能函数,屏蔽对图形的复杂处理Funcode平台提供了大量功能函数,屏蔽对图形对象的复杂处理,使学生能够专注于程序设计和游戏逻辑功能的实现。例如:功能函数voiddSetSpriteLinearVelocityX(constchar*szName,constfloatfVelX)可以使精灵以某一速度水平运动。让图1左侧中的鱼(假设该鱼命名为fish0)游动起来,学生只需用一条函数调用语句dSetSpriteLinearVeloctyX(“fish0”,30)即可实现;亦可通过调用功能函数dSetSpriteLinearVelocity(“fish0”,30,30)使鱼水平方向和垂直方向分速度均为30,即在屏幕上“斜向”游动;功能函数dSetSpriteFlipX(“fish0”,true)调用可以使鱼水平翻转,即实现“掉头”功能。

1.3整体逻辑框架简洁,功能强大Funcode平台整体逻辑框架由7个主要函数模块组成,分别是主函数模块、鼠标移动事件模块、鼠标单击事件模块、按键事件模块、按键弹起事件模块、对象碰撞事件模块、对象与边界碰撞事件模块。其主函数模块如以下程序代码所示,通过主函数模块控制整个游戏的运行和界面刷新。其他的6个函数模块几乎包含了游戏设计中需要处理的所有事件,并且向学生屏蔽了事件激发所需要的复杂判断过程,所有的鼠标事件、键盘事件、碰撞事件均为自动激发,这很大程度上降低了设计难度,使学生可以专注于游戏逻辑功能的实现。例如:要实现图1中的“鱼”游到右侧边界时掉头向左游逻辑功能,在Funcode平台下,当图1中的“鱼”游到右侧边界时,“对象与边界碰撞”模块将会自动激发,该模块的初始程序代码如下所示。此时,学生无需判断和处理“鱼”是否游到边界(这对大学一年级学生而言比较困难),只需要知道“鱼”游到边界后会自动调用“对象与边界碰撞”模块对应的dOnSpriteColWorldLimit函数即可。因此,学生只要能够根据游戏功能在该函数中正确地编写相应的代码就可以了,具体实现“掉头向左游”逻辑功能的完整程序代码如下所示。显然,这样就极大地简化了对图形对象和事件的处理,学生就可以把更多的精力投入到游戏逻辑功能的实现和代码的编写和调试中。

1.4开放式环境,极大地激发学生创新能力Funcode提供了开放式的开发环境,除了完成Funcode提供的课程设计案例以外,学生也可以按照自己的思路,添加素材,大胆创新,设计和开发真正属于自己的游戏,这样能极大地激发学生的程序设计热情。例如:一组学生开发的“大鱼吃小鱼”游戏,当大鱼吃小鱼得分达到一定的分值时,可以生出“鱼宝宝”,尾随大鱼游动,生动有趣。

2教学内容和方法的改革

基于Funcode平台,在教学内容和方法的改革上,以激发学生兴趣,调动学生学习主动性为主要目标,在此基础上,贯穿整个课程设计的各个阶段,采用多种教学方式和方法培养学生各方面的综合素质。

2.1选题阶段在选题内容上,典型游戏设计和自主创新相结合。改变原有的设计内容变为基于Funcode平台游戏设计。设计内容分为两类:一类是典型的可在Funcode平台上实现的游戏,比如坦克大战、打地鼠等;另一类是学生自选题目,要学生根据Funcode平台功能,发挥自己的想象力,创造自己的游戏。教师要通过讨论、引导等方式,鼓励学生自己设计游戏,培养其创新意识和创新能力。题目选定之后,要求学生将游戏整体功能用功能模块和流程图的方式清楚地表示出来,并且要能够准确地描述各模块之间的关系,锻炼学生的抽象思维和逻辑思维能力。在选题方式上,要坚持组内讨论和师生互动相结合。组内讨论有利于游戏功能的完善,有利于发挥所有同学的创新潜力,有利于调动学生参与的积极性。通过教师和学生的讨论交流,教师要控制游戏功能的实现复杂度,既要保证设计的工作量,又要保证控制在可实现的范围内。

2.2设计阶段在课程设计过程中,要避免“学生问,教师答”的教学模式,教师要积极地参与到所有学生的设计中,主动和学生交流讨论,掌握他们的设计情况;善于通过引导启发,培养学生各方面的综合素质。在设计中,要及时发现并指出存在的问题;对于学生提出的问题,要善于引导他们积极独立思考,尽量让其自主分析,找到原因,进而找到解决问题的方法,这一方面可以培养学生独立思考,分析问题和解决问题的能力,另一方面可以增强学生的成就感和自信心,有利于调动学生参与实践的热情。对于游戏功能的实现,要让学生画出流程图或实现步骤,体会程序设计中的抽象思维和逻辑思维。比如对于“打飞虫”游戏,当“拍子”拍中“飞虫”时,对应Funcode抽象概念为“拍子”对象和“飞虫”对象发生碰撞事件,由于碰撞事件自动激发,所以拍中“飞虫”后对应的游戏功能实现逻辑应该在碰撞事件中表达。对于该碰撞事件的处理,要求学生首先画出拍中“飞虫”后的处理逻辑,体会程序设计中的逻辑思维。比如:使“飞虫”图像从界面消失在“飞虫”链表中删除该飞虫显示拍效根据拍中的“飞虫”类型计分刷新游戏界面上显示的实时得分值。课程设计要求按组进行,设计中要求分工合理,任务明确,紧密协作,严格按照日程安排,完成设计任务。要求每2天一次,将每人独立设计的模块进行整合并测试,同时要求学生定期开展讨论,鼓励他们对设计中存在的问题,积极和同组同学交流沟通,要善于发挥集体的力量,解决问题。在协作设计中,培养学生的团队合作意识。此外,在游戏的设计过程中,必然会存在一些较难实现或者知识点超出课本内容的功能,从经验来看,大多数学生都会无奈地选择放弃该功能。此时,教师一定要向学生强调自主学习的重要意义,让他们认识到课堂教学中讲的内容大多是最基础的核心知识点,而实际的应用中要涉及的知识却远非如此,并积极鼓励和指导学生学习和掌握相关知识点。

2.3考评阶段为了进一步培养学生兴趣,调动其积极性,考核采用每组分别进行讲解和演示,交流心得体会,其他组同学和教师进行打分的形式。打分项分为游戏功能、工作量、流畅性、创新性、美观性等5个方面。演示中鼓励其他组的同学提问和试玩游戏,尽量找出游戏设计的缺陷,通过多种方式培养学生的展示能力和竞争意识。最后,教师再进行总结性点评,指出设计的优缺点。

3教学效果

从调动学生学习积极性方面来看,在整个课程设计过程中,学生始终保持着极高的热情。教师为课程设计建立了QQ群,提供全天答疑服务,从QQ群讨论情况来看,学生提问很多,讨论热烈,而且绝大多数在课外时间。此外,课程设计结束后,很多学生指出,Funcode平台美中不足的是:自己创造出的游戏最终生成的可执行程序离开Funcode平台不能运行,非常令人遗憾。这也可以从一个侧面反映了学生的热情和对自己劳动成果的珍惜。从课程设计内容来看,学生大多是按照自己的想法设计的,游戏功能可谓五花八门,创新能力得到了很好的培养和锻炼。更重要的一点是达到了课程设计的教学目的,学生对程序设计的理解更加深刻,巩固了C语言学习成果,能够将游戏功能的实现逻辑用计算机语言准确地表达出来。在程序设计中遇到的具体问题,学生能够提出自己的解决思路,并通过编写程序表达自己的思路,很好地将课堂上学到的理论知识应用于实际问题的解决,抽象思维和逻辑思维能力、程序设计实践动手能力均得到了很好的锻炼。例如:图2所示为学生设计的游戏初始界面。该游戏实现的功能有:游戏实时倒计时;游戏实时显示得分;通过键盘控制游戏的开始、暂停和游戏场景的切换;用鼠标控制“拍子”进行移动和拍打;打到大蚊子、小蚊子积分不同,打到坚果则减分,且打中目标有图片特效产生;蚊子的产生地点、时间、数量和产生时的飞行速度都是随机的,且飞行速度随着积分级别越来越快;游戏结束时显示得分最高的三条历史记录等。此游戏中,学生自己编写代码(不包括自动生成的代码)行数在800行以上,使用的C语言知识点涵盖了数组、链表、函数、变量作用域、多分支结构、循环结构等。

4结语

第4篇

关键词IPSec;NAT;IKE;UDP封装

1引言

基于IP技术的虚拟专用网(VirtualProfessionalNetwork,简称VPN)是通过Internet平台将局域网扩展到远程网络和远程计算机用户的一种成本效益极佳的方法。随着网络安全技术的飞快发展,越来越多大型企业利用互联网采用IPSec技术建立VPN网络,IPSec已逐渐成为VPN构建的主流技术。IP安全协议(IPSecurityProtocol,简称IPSec)是由互联网工程工业组(InternetEngineeringTaskForce,简称IETF)1998年底规划并制定的网络IP层标准。IPSec不仅可以为IP协议层以上所有的高层协议和应用提供一致性的安全保护,而且除了可用于IPv4之外,也可用于下一代IP协议IPv6。

另外,NAT(NetworkAddressTranslation)技术通过改变进出内部网络的IP数据包的源和目的地址,把无效的内部网络地址翻译成合法的IP地址在Internet上使用。该技术一方面可以把私有IP地址隐藏起来,使外界无法直接访问内部网络,对内部网络起到保护作用;另一方面,它可以缓解由于IPv4先天设计上的不足,而导致的IP地址严重短缺的现状。

但是,被广泛使用的网络地址转换(NAT)设备却制约着基于IPSec技术的VPN的发展,这是因为IPSec协议在VPN中承担保护传输数据的安全性任务。在数据传输过程中,任何对IP地址及传输标志符的修改,都被视作对该协议的违背,并导致数据包不能通过安全检查而被丢弃。但在VPN中运用NAT技术,则不可避免地要将私网地址映射为公网地址,即对IP地址要进行修改。因此,在VPN网络中如何使IPSec和NAT协同工作,实现NAT的透明穿透具有现实意义。

2协议介绍

2.1IPSec

IPSec包括安全协议和密钥管理两部分。其中,AH和ESP是两个安全协议,提供数据源验证、面向无连接的数据完整性、抗重放、数据机密性和有限抗流量分析等安全任务。为了能够将相应的安全服务、算法和密钥应用于需要保护的安全通道,IPSec规定两个通信实体进行IPSec通信之前首先构建安全关联SA。SA规定了通信实体双方所需要的具体安全协议、加密算法、认证算法以及密钥。IKE提供了用来协商、交换和更新SA以及密钥的完整机制。

IPSec定义了两种类型的封装模式——传输模式和隧道模式。传输模式只对IP分组应用IPSec协议,对IP报头不进行任何修改,它只能应用于主机对主机的IPSec虚拟专用网VPN中。隧道模式中IPSec将原有的IP分组封装成带有新的IP报头的IPSec分组,这样原有的IP分组就被有效地隐藏起来了。隧道主要应用于主机到网关的远程接入的情况。

2.2NAT

NAT能解决目前IP地址紧缺的问题,而且能使得内外网络隔离,提供一定的网络安全保障。它解决问题的办法是:在内部网络中使用内部地址,通过NAT把内部地址翻译成合法的IP地址在Internet上使用,其具体的做法是把IP包内的地址或用合法的IP地址来替换。NAT功能通常被集成到路由器、防火墙、ISDN路由器或者单独的NAT设备中。

NAT有三种类型:静态NAT、动态地址NAT、网络地址端口转换NAPT。其中静态NAT设置起来最为简单,内部网络中的每个主机都被永久映射成外部网络中的某个合法的地址。而动态地址NAT则是在外部网络中定义了一系列的合法地址,采用动态分配的方法映射到内部网络。NAPT则是把内部地址映射到外部网络的一个IP地址的不同端口上。根据不同的需要,三种NAT方案各有利弊。

3IPSec与NAT的不兼容性分析

根据协议的定义,我们知道IPSec和NAT两个协议之间存在一定的不兼容性。其不兼容性主要有以下几种形式:

1)NAT对AH的影响

IPSecAH进行验证的时候,处理的是整个IP包,包括源地址和目的地址。如果IPSec通信双方存在NAT设备,NAT设备就会修改外层IP包头的源地址并修改其校验和,这样接收方会因认证失败而丢弃该包。

2)NAT对ESP的影响

TCP/UDP校验和地计算涉及一个虚构的IP包头,该包头含有IP源和目的地址。因此,当NAT设备改变IP地址时也需要更新IP头和TCP/UDP校验和。如果采用ESP传输模式,IP包经过NAT设备时,NAT设备修改了IP包头,但是TCP/UDP校验和由于处于加密负载中而无法被修改。这样,该信包经过IPSec层后将因为TCP协议层的校验和的错误而被丢弃。

另外,由于TCP/UDP校验和只与内层原始IP包头有关,外层IP包头的修改并不对其造成影响,因此采用ESP隧道模式和仅静态或动态NAT的情况下不存在TCP校验和的问题。但是,在NAPT情况下,因为NAPT需要TCP/UDP端口来匹配出入信包,而端口号受到ESP加密保护,所以ESP分组通信将会失败。

3)NAT对IKE的影响

IKE主模式与快速模式中如果使用IP地址作为身份信息,经过NAT后,会导致IKE协商的失败。

IKE协议使用固定目的端口500,当NAPT设备后的多个主机向同一响应者发起SA协商时,为了实现多路分发返回的IKE包,NAPT修改外出的IKE包的UDP源端口。因此,响应者应该能处理端口号并非500的IKE协商请求,但往往NAPT对UDP端口的映射很快会被删除,再协商的过程就将出现一些不可预见的问题,很容易导致NAPT设备无法将协商包送到正确的目的地。

综上所述,IPSec组件对NAT的支持能力如表1所示从表1中可以看出,只有在隧道模式和地址转换情况下才可以实现IPSec数据流的NAT穿越。这一方法既降低了IPSec协议的安全性,又限制了NAT的工作方式,因此在实际应用中可行度较差。

4IPSec与NAT的兼容性要求

在现有的条件下,为了推动基于IPSec的VPN的发展,IPSec和NAT兼容性解决方案需要满足下列要求:

1)可部署性

IPSec和NAT兼容性解决方案作为一个过渡的解决办法必须比IPv6易于部署。应该只需修改主机,无需改变路由器,在短时间内能与现存的路由器和NAT产品协同工作。

2)远程访问

IPSec的一个重要应用是远程访问公司的内部网络。NAT穿越方案必须考虑远程客户端与VPN网关之间存在多个NAT的情况。

3)防火墙兼容性

IPSec和NAT兼容性方案应该避免对IKE或IPSec目的端口的动态分配,使防火墙管理员进行简单的配置,就可以控制穿越NAT的IPSec数据流。

4)可扩展性

IPSec和NAT兼容性方案应具有良好的扩展性,必须保证在大规模远程访问的环境中,在大量远程接入的环境下,同一时间段多个主机和远程安全网关建立连接。

5)后向兼容性

IPSec和NAT兼容性方案中必须能与已有的IPSec实现互操作。穿越方案应该能自动检测是否存在NAT,能判断通信对方的IKE实现是否支持NAT穿越。

6)安全性

IPSec和NAT兼容性解决方案的引入必须保证不得带来新的安全漏洞。

5利用UDP封装法实现NAT的穿透

本文中的解决方案是采用UDP封装法实现NAT的透明穿透,不需要修改现有的NAT网关和路由器。所以该方案具有简单且易于实现的优点,缺点是由于添加了一个UDP报文头,而加大了带宽开销,但相对于目前持续扩大的传输带宽来说,这个UDP报文头的带宽开销可以忽略不计。下面详细讨论其原理和实现过程。

5.1封装格式

UDP封装法是在原有的IP包的IP头和AH/ESP的数据之间再封装一个UDP头,这样封装后的数据包端口值对NAT可见,就可以正确的实现端口转换。UDP封装格式如图1所示。

另外,由于IKE已经使用了UDP的500端口,为了简化配置和避免多个端口带来的安全隐患,UDP封装的ESP也使用该端口。这样就需要采取一定的方法来区分端口500的数据包是IKE消息还是UDP封装的ESP。为了区分两者,我们采用在IKE报头添加Non-ESP标记。在确定存在一个中间NAT之后,支持IPSecNAT-T的对话方开始使用新的IKE报头。

5.2IKE协商过程

IPSec通信实体双方是否采用UDP封装取决于对话对方是否支持该方法以及是否存在NAT设备,这个过程通过IKE协商来完成。在IKE协商过程中增添了新的NAT-D和NAT-OA有效载荷和以及UDP通道类型。

1)新的NAT-Discovery(NAT-D)有效载荷

这个新的有效载荷包含一个散列值,它整合了一个地址和端口号。在主模式协商期间,即IKE协商第一阶段第三、四条消息中,IPSec对话方包括两个NAT-Discovery有效载荷——一个用于目标地址和端口,另一个用于源地址和端口。接收方使用NAT-Discovery有效载荷来发现NAT之后是否存在一个经NAT转换过的地址或端口号,并基于被改变的地址和端口号来确定是否有对话方位于NAT之后。

2)新的NAT-OriginalAddress(NAT-OA)有效载荷:这个新的有效载荷包含IPSec对话方的原始地址。对于UDP封装的ESP传输模式,每个对话方在快速模式协商期间发送NAT-OA有效载荷。接收方将这个地址存储在用于SA的参数中。

3)用于UDP封装的ESP传输模式和隧道模式的新的封装模式

这两种新的封装模式是在快速模式协商期间指定的,用于通知IPSec对话方应该对ESP使用UDP封装。

5.3地址通告和Keepalive包

由于用UDP来封装IPSec分组的思想只解决了NAPT设备不支持AH和ESP通信的问题。例如TCP校验和错误、UDP端口映射的保持等问题还需要辅助方法来解决。

为保证校验和正确无误,通信双方需将自身的原始IP地址和端口发送给对方,即实现地址通告。地址通告的实现通过IKE第二阶段的前两条消息中的NAT-OA有效载荷。因为NAT-OA有效载荷中包含IPSec对话方的原始地址,为此,接收方就拥有了检验解密之后的上层校验和所需的信息。

消息发起者在NAT中创建了一个UDP端口映射,它在初始主模式和快速模式IKE协商期间使用。然而,NAT中的UDP映射通常超过一定时间没用就会被删除掉。如果响应者随后向发起者发送IKE消息却没有提供UDP端口映射,那么这些消息将被NAT丢弃。这个问题的解决办法是通过定期发送Keepalive包,用于后续IKE协商和UDP封装的ESP的UDP端口映射同时在NAT中得到刷新,从而保证通信的正常运行。

6结束语

IPSec作为网络层的安全协议,目前的应用越来越广泛,已成为构建VPN的基础协议之一。而由于IPv6取代IPv4将是一个漫长的过程,NAT设备的广泛存在极大地限制了IP层安全协议IPSec的推广,因此在目前的条件下,UDP封装方法无疑是一种在当前环境下无需修改NAT网关和路由器、简单可接受的解决IPSec和NAT兼容性的方法,具有一定的现实意义。但是该方案还不完善,有待进一步讨论和研究。

参考文献

[1]RFC3022-2001.TraditionalIPnetworkaddresstranslator(TraditionalNAT)[S].

[2]RFC2401-1998.SecurityArchitectureoftheInternetProtocol[S].

[3]RFC2402-1998.IPAuthenticationHeader[S].

[4]RFC2406-1998.IPEncapsulatingSecurityPayload(ESP)[S].

[5]RFC2409-1998.TheInternetKeyExchange(IKE)[S].

[6]RFC3103-2001.RealmSpecificIPProtocolSpecification[S].

[7]AbobaB,WilliamDixon.IPSec-NATcompatibilityrequirements[Z].Internetdraft,draft-ietf-ipsec-nat-reqtstxt,2001

第5篇

1.1计算机软件C语言的编程技巧

计算机软件C语言的编程中,最主要的依据是指针应用,C语言指针能够根据软件程序的编写需求,构建可行的函数,而程序员在设计函数编程的过程中,即可通过函数参数的具体分配,设置C语言的指令控制。程序员利用C语言编写软件程序时,不仅要准确地控制指令,更重要的是编制C语言的算法。C语言的算法内,体现出诸多应用技巧,利用流程表示的方法规划操作位置,以此来提高C语言的流程算法。程序员编程软件C语言时,需要注意语言设置,首先确定C语言在软件编写中的对象,如程序运算,保障C语言在编程实验中的对象;然后分类计算机软件编程所需的文件,完善文件之间的关联性,设定C语言编程文件的相关步骤;最后全面检查软件C语言编程中涉及的数据,方便编程中的数据查找。

1.2计算机软件C语言的程序应用

计算机软件C语言编程实验中的程序应用,分为函数、算法和运算三个部分。分析如:

(1)C语言在软件编程中的函数,软件编程的函数,负责不同的软件功能,程序员通过C语言定义编程中的函数,由于C语言可以实现编译,因此软件编程所需要的函数,可以在系统内直接调用,程序员操作“#include指令”,关联所有的应用文件,如程序员使用C语言中的sqrt函数,还需引入头文件#include“string.h”;

(2)算法是计算机软件编程的核心,C语言在基础算法的作用下,实现程序表达,程序员需要掌握程序算法,才能保障C语言在计算机软件中合理性,程序员还要在算法的过程中,添加流程图,利用流程符号协助算法运行,提高C语言编程的效率;

(3)运算是C语言编程实验的特色,其对象是二进制,按照计算机软件的C语言编程,设计程序运算,软件的C语言编程中包括诸多基础文件,此类文件是软件编程的重要部分,程序员将编写程序存储到相关的语言内,有利于运算过程中的语言查询。

2计算机软件C语言编程的案例

计算机软件C语言的程序设计比较复杂,以混合软件编程为例,分析C语言的编程。首先程序员应该根据计算机软件的运行目的,将运行语句编写到C语言中,形成源代码,程序员需要连接C语言中的汇编语句,如:Main(){asm{Movah,2Movbh,5Int10h}}整个编程实验案例中,C语言的语句汇编存在格式要求,而且格式较为固定,因此,程序员应遵循一定要求,如:检查语句中是否具备asm,如果缺少asm需重新设定在语句前;确定汇编语句能够正常嵌入C语言内;注意C语言的分隔符,分隔符必须正确。然后设置编译代码,此项模块需要具备单独编程,待C语言编程完成后,利用链接的方式联合代码和编程。混合软件编程中的C语言,函数部分能够被汇编使用,多个编程共同组成一项语言任务,而且C语言倾向于独立编程,基本是以函数的状态实现软件的编程实验。编译代码的应用,提高C语言在计算机软件中的编程能力,保障C语言编程的准确度,强化计算机软件的实践性。最后程序员在混合软件C语言编程实验中,需注重已经出现的编程问题,尤其是参数、存储等问题,排除C语言编程的因素干扰。例如C语言编程实验中出现的参数问题,实际汇编中无法实现正常的参数传递,导致参数堆栈传输时出现问题,不能正常汇编到C语言的程序内,因此还需在汇编中增加两类指令,如:sp、pushbppopbp。混合软件C语言中添加汇编方式,可以提升计算机软件程序的运行速度,完善软件编程。

3结语

第6篇

关键词:BEC;存在问题;措施

一、BEC商务英语的概念

剑桥商务英语证书(BEC)考试是教育部考试中心和英国剑桥大学考试委员会合作举办的权威性考试。目前分为(BEC1)、中(BEC2)、高(BEC3)三个级别。这三个考试是针对英语为非母语国家的需求而设计的主要在经济迅速发展、国际交流日益增多的国家和地区实施,具有更广泛的适用性,因而在国际上受到普遍欢迎。目前已有28个亚洲和欧洲国家或地区,包括一些经济发达国家已开始举办BEC考试。该系列考试是一项水平考试,它根据商务工作的实际需要,从听、说、读、写四个方面对考生在商务和一般生活环境下使用英语的能力进行全面考查,对成绩及格者提供由英国剑桥大学考试委员会颁发的标准统一证书。由于该证书的权威性,已成为在所有举办该考试的一百多个国家和地区求职的“通行证”。

二、我国考生通过率情况

在各种英语类通行证中,中国考生向来以高通过率而著称。与此相比,中国的BEC考试通过率却显得有些尴尬。

剑桥大学ESOL考试委员会的BEC成绩报告显示:中国考生的通过率明显低于其他非英语国家考生通过率。2006年5月全球BEC平均通过率是43%,中国考区只有37%,而除中国以外的全球通过率为57—58%。

近几年来,中国BEC考试报名率以每年300%的速度疯狂飙升,中国考区的通过率却一直处于低迷徘徊阶段,严重拖累了世界的BEC通过率。为什么中国BEC的通过率低于世界水平?BEC考试由写作、听力、阅读、口试四个部分组成,只有A、B、C三类为有效成绩。如果有两个部分为D,那么总体成绩就是D,即为无效成绩。剑桥大学考试部授权的中国培训官陈雪翎指出:中国学生写作、听力、阅读、口试的成绩往往不在同一个标准上。

三、目前听力口语教学存在问题

1.缺乏相关商务知识。中国学生之所以在听力方面常常“败北”,原因就在于这两部分对于专业的商务知识要求较高。首先,口话话题往往都是商务方面的,在表述中需运用专业术语、专业语境,如果这方面欠缺,成绩自然大受影响。

2.非标准化的英语表达法。由于《新编剑桥商务英语》(中级)为原版引进,没有中文说明和解释,所以对于文化背景不同、英语能力有限、商务知识欠缺的广大中国考生来说,难免感到困难,特别在听力部分融合了大量口语化的表示法、俚语以及行业术语,与学生平时听到的标准化的发音迥然不同,加之口音问题,更增加了一定的难度。

3.缺乏相关跨文化背景知识。各民族语言含有大量的文化因素,这是构成民族文化的要素之一。不同的文化之间自然会呈现不同的文化形态,这种文化形态差异反映到语言层面上,则表现为语言差异。传统商务英语教材以语法操练为主,教学内容单一、陈旧、跟不上现代英语的发展。四、BEC商务英语口语听力教学的几项措施

1.针对教材听力资料。熟悉听力材料,弄懂段落中所涉及的商务词汇概念及其Mainidea。在足够熟悉此段落中的内容后,脱离文字材料先听一遍磁带,此时绝对不允许照着文字材料听,看看自己究竟能听懂多少,然后把听不懂或容易出问题的部分特别列出,再听一遍,此次应特别留心其词义的语音及商业内涵。尤其是俚语以及行业术语。然后再反复使用录音机上的重复键,尽最大努力听懂全文内容。

2.朗读听力部分的内容。实际上,如果留意,我们不难发现,本教材的听力材料实际上就是商务化的口语,无论从语音的标准化程度、语法的准确度以及大量语气词的运用,都可以说明这一点。所以,这就为我们将听力与口语结合学习训练提供了较好的机会和可能。

3.具体到课堂

(1)商务背景知识介绍。由于文化的差异及学生知识结构的问题,加之中外企业管理模式和操作流程的不同,致使学生不了解每个单元所涉及主题的详细内容。(2)口语的练习。在我国,对于大部分大学生而言,对英语的学习普遍存在比较突出的问题是:语法及词汇量不是问题,关键是听力及口语。针对这一现象,并结合BEC考试对口语的要求,笔者除每单元中涉及到的Speaking部分需要学生在课堂上用英语探讨以外,另外在每学期的期末考试中加入口语测试部分,要求学生在本学期学习的商务知识中,任选一个topic,在全班同学面前做一个Presentation.。

五、考前准备

一般说来,应对BEC中级听力特别是短文听力,其备考训练必须抓住竖听和横听两点结合来进行。所谓竖听,是指一套题目从头听到尾,从第一题听到最后一题。所谓横听,是指把相同题材和体裁的文章放在一块对照比较着听,从而迅速抓住同类型文章的规律,真正做到以不变应万变。通过这样反复对比听,可以使我们很快掌握各种题材文章的模式和考题思路,在短时间内抓住考点,做到举一反三。

在考前一个月,笔者在此提供一套具体的短文听力训练办法,考生可以从BEC中级历年考题中选取10篇以上不同题材的文章,横竖结合起来,进行精听训练,以便在考试中赢得时间,确保其准确性。

考前对于口语的训练,应注意从商务的不同角度,最少选择10个以上的topic,与同学结对训练,在注意专业词汇量积累运用的同时,尽量做到熟练,要言之有物,观点突出。

总之,BEC中级短文听力及口语并不可怕,如果我们能够宏观把握,平时坚持“用心去听”,认真练,我们肯定能够从不同角度、不同层次提高自己的商务英语语言能力,顺利通过BEC考试。

参考文献:

第7篇

行动导向教学模式是引用德国职业教育的一种先进的教学理念,这种教学模式从根本上改变了传统的教学方法,它是一种职业化的教育模式,是目前高等职业教育主要采用的一种教学模式。行动导向教学模式在教学具体实施过程中,不是单一的教学方法,也不是简单的几种教学方法的结合,而是由一系列具体的教学方法有效的结合在一起,相辅相成,扬长避短。项目教学法,是行动导向教学模式中的一种教学方法,是指老师和学生共同完成一个项目,在项目的实现过程中,需要学生独立完成资料查询、项目的研究和学习,项目教学法使学生在学习过程中更具有针对性和实用性,为今后就业所必须的实践能力、综合能力、信息交流能力、团队合作能力、分析问题以及解决问题的能力奠定了基础。

二、基于行动导向的项目教学法在C语言课程教学中的具体应用

C语言程序设计课程采用项目教学法进行教学改革,其主要目的是培养学生自动学习、解决问题的能力。培养学生具有团队意识和服务意识,具有良好的职业道德和职业素养的技术技能型人才。按照行动导向项目教学法的实施步骤,C语言课程的整个教学过程中大体分为收集资料阶段、制定项目教学计划阶段、项目教学的实施阶段、项目教学的检查评估阶段。具体步骤如下:

1.收集资料阶段。

老师带领学生通过问卷调查、资料查阅、需求分析等手段广泛深入地进行项目调研,将调研数据加工整理,筛选出适合高职院校学生特点的项目形成项目库。主要包括学生管理系统、档案管理系统、图书管理系统等10个项目,这些项目的主要特点是贴近学生的生活,学生比较好理解而且参考资料丰富。

2.制定项目教学计划阶段。

先由任课教师讨论,制定项目教学课程标准和教学计划,确定项目教学的步骤和教学使用的项目程序。项目的教学计划主要包括以下两方面内容:

2.1C语言程序设计课程项目教学的课程标准。

制定C语言程序设计这门课程项目教学法的课程标准要依据该课程的性质、目标以及内容等特点,结合高职院校的实际情况,针对不同层次的学生在知识与技能的掌握、过程与方法的运用等方面提出教学和评价建议。通过课程标准的制定,使学生在经过一段时间C语言的学习后,应该知道什么是C语言和C语言能做什么。该课程的课程标准主要包括C语言的课程性质、课程目标、学习内容、实施建议、考核方式等方面的内容。

2.2C语言程序设计课程项目教学授课计划。

通过授课计划的编写,对C语言程序设计这门课程进行整体规划,按照项目教学的要求,要有针对性、目的性、可行性的将教学内容总的方向、总的结构、课时分配等作出全面安排。授课计划的编写要在科学的教育理论指导下,深入研究教材和《课程标准》,灵活安排教学内容,实现教学目标。

3.项目教学的实施阶段。

3.1项目教学法的课前准备。

根据项目教学计划和学生本身的特点,任课教师在上课前应做好充分的准备,按照教学计划准备教学课件、教案、教学材料,按照项目教学法对学生进行分组设计,分组时,根据学生的学习水平的差异,好坏混合搭配,势力均衡,目的是好同学带动坏同学。

3.2项目教学法的任务分配。

教师根据项目中的情景,布置任务。首先由教师引导学生分析任务,提出完成任务的相关知识点、设想或探索的路径供学生参考,然后根据学生实际情况分组讨论,根据教师提供的信息,查阅资料或寻求教师的指导,最终完成任务。

3.3项目教学法的任务实现。

该阶段的任务是任务教学法最主要的一部分。教师在下达任务阶段引导学生掌握完成任务的思路和方法后。在任务完成过程中,以学生为主,每个小组成员根据教师的指导,学习相关的理论知识,通过查阅相关资料、交流讨论等方法将理论知识向实践转化,即项目的代码编写、调试和运行,完成分配的任务。

3.4项目教学法的项目成果展示。

在各小组完成学习任务以后,每组选派一名本组成员进行成果展示与交流。其他小组成员可根据任务相关的知识点提问疑问或请教交流,丰富彼此的学习体验。最后,教师对学生完成的项目情况归纳总结并引导学生对项目完成过程中遇到的问题进行反思以便对下一次的学习设计进行优化、改进。

4.项目教学的检查评估。

C语言程序设计这门课程项目教学的考核应根据课程标准中的目标和要求,结合项目教学的过程和成果,进行综合打分。考核评价过程主要分为平时考核和期末考核,其中,平时考核包括平时上课学生完成每个学习情境的情况和出勤情况,先由学生对自己完成的情景任务进行答辩,再由教师检查评分,其成绩占总成绩的50%;期末考核为上机操作考试,其成绩占总成绩的50%,考试题目通过抽签选取,题目的内容为学习情境中的同类型任务。最终成绩是平时考核成绩和期末考核成绩的总和。使对学习过程和对学习结果的评价达到和谐统一的目标。

三、基于行动导向的项目教学法在c语言课程教学实施过程中面临的困难与对策

第8篇

C语言是一种计算机程序设计语言,是计算机汇编语言的重要组成部分。其实质就是通过对语言进行编写和翻译,使其产生一种与社会相衔接的语言,让人和计算之间通过这种语言能够进行简单的交流。C语言是在1972年由美国贝尔研究所提出,1978年先后被运用到各种机型中。C语言具有双重性,具备高级语言的特点和汇编语言的优越性,不仅能对系统应用程序进行编写,而且能对不依靠计算机硬件的应用程序进行编写。同时C语言也具有广泛的应用性,能在多个计算机的操作系统中运用,大大提高了计算机软件编程的效率。随着计算机的日益普及,C语言的应用领域越来越宽,成为目前较为流行的高级程序设计语言之一,在许多大型的软件编程中被广泛的应用。C语言具有如下的特点:

1.1模块化思想模块化的基本思想就是运用C语言在进行计算机软件编程设计时,按功能作用的不同将一个较大的程序分割成为许多小的子模块,使每个小的子模块成为一个功能单一、理解简单和结构合理的小程序。

1.2简洁性强C语言具有语言简洁、结构紧凑、使用方便、灵活的优势。C语言包含了32个关键字和9条控制语句,源程序书写方式较自由灵活,因此在计算机软件编程中要选择使用小写字母,压缩掉所有不重要的部分。

1.3运算范围广C语言总共具有34种运算符,其运算符号十分丰富且对运输结果能采用各种各样的表达形式,因此C语言的数据处理能力强,可以为各类数据结构进行复杂的运算,进行一些高级语言较难实现的运算功能。

1.4移植泛用性C语言在进行软件编程中基本上不需要做任何的修改,就能运用于各种不同型号的计算机和操作系统环境上,从而形成很多不同版本的C语言。

1.5应用效率高C语言的应用结构简单清晰,能够对内存中的相应地址进行直接的访问,操作十分方便,被称为高级语言中的低级语言。同时能够直接调用系统功能,直接操作硬件,具备许多高级语言所不具备的高效率。

2.C语言在计算机软件编程中的技巧

C语言具有模块化的特点,因此在计算机软件程序编程中,充分发挥C语言的灵活性和方便性,提高软件编程的技巧性,能够优化软件程序编辑和提高软件开发的效率和质量。

2.1变量数据和运算模式的合理设置设置变量数据时,要在最大限度满足计算机软件编程需要的前提下,尽可能合理的设置变量数据,使用无符号的最小数据类型,这样能减少程序代码,从而促进计算机软件编程的有效运行。同时在设置运算模式时,要尽量运用定点运算,避免运用浮点运算。

2.2变量存贮器类型的合理定义在计算机软件编程中,采用和操作不同类型的变量存贮器时,会造成编译后的代码执行效率各不相同,只有合理定义变量存贮器类型,才能不断提高程序的执行效率。因此在定义变量存贮器类型时,应在满足条件的情况下尽量选用内部直接寻址存贮器。

2.3变量存贮类型的灵活设置在计算机软件编程中,C语言具有模块化思想,正确函数变量的传递在编程中十分重要,因此子程序模块使用的变量常采用局部变量,而整个程序模块使用的变量要采用全局变量。另外在C语言中灵活使用指针、结构和联合,也便于数据的传递,提高软件编程的效率。

2.4设计软件编程与C语言的接口C语言具有程序执行速度快和直接操作硬件的优势,在进行数据采集、中断服务器处理和实时控制时,可以将C语言程序运用到计算机软件编程中,自行控制数据的传递,从而能够精确控制任务,加快实时响应。

2.5编译控制指令的正确选择C语言能为计算机的软件编程提供了20多条控制指令,总体可分为首要控制指令和一般控制指令,首要控制指令的选择只能用一次,要放在源程序的开始处,以防止重复而导致停止编译,而一般控制指令的选择可以多次。因此选择正确的控制指令,能加速程序调试过程。

3.C语言在计算机软件编程中的应用

C语言具有很强的优越性,可以适用于计算机软件编程实验研究,这就需要对C语言在计算机软件编程中的应用有一个全面的认识,避免在以后的程序设计过程中出现基础不足的情况。

3.1指针的应用C语言中的指针代表相关变量、相应函数的地址和地址相对应的存储内容。在进行软件编程时,如果一个相应的变量声明前面,出现“*”号,那就表示这个内存地址相对应的存储内容。通常情况下C语言的一个指针代表着一个相应函数的地址,是一个常量。此外,C语言的指针可以在调用函数时得到几个不同于return(z)的返回值。

3.2字符串在C语言中,字符串是一种以ASCII的UNL作为数组退出的一种chair型的数组,在计算机软件编程中,字符串的使用一般不需要引用库。但在C标准库中包含着一些函数可以操作相应的字符串,在使用这些函数时,需要运用相对应的头文件进行引用。

3.3C语言结构C语言主要包括三种结构模式即顺序结构、选择结构和循环结构。顺序结构在C语言中是按照先后次序进行操作,通过构建一个相对简单和完整的程序,进行相对独立的运用。循环结构是在进行各种数据运算和处理时,需要对其中的一些语句进行反复的执行,这在一定程度上简化了程序的长度,使程序变得简洁。选择结构是根据相关的分支条件选择相应的执行路径,在计算机软件编程中要选择具有较强适应性执行路径。

第9篇

论文关键词:函数,指针

 

0 引言

随着计算机技术的飞速发展及应用领域的扩大,熟练掌握一门语言已变的尤为关键。C语言这门课程在计算机的基础教学中一直占有比较重要的地位,然而要想突破C语言的学习,对函数和指针的掌握是非常重要的,本文将具体针对函数和指针的关系做详尽的介绍。

1 函数的有关概念

为了使程序的编写更加清晰、直观且易于修改,C语言中引用了函数。所谓函数,就是一个程序模块,该模块用来完成一个特定的程序功能。引用一个函数时,需要包括对函数的定义、声明,继而调用。此外,函数主要包括库函数和用户定义函数,调用库函数时,要用#include命令将相关的头文件包含进来。在掌握函数相关概念的同时,有以下几点需要注意:

(1) 函数的定义是平行的,不能在一个函数的内部再定义函数,而只能在一个函数中调用另外一个函数,例如:

int A(int a,…)

{

声明部分;

int B(int b,…)

{

声明部分; 执行部分;

}

执行部分;

}

(例1-1)

显然毕业论文ppt,这种定义函数的方法是错误的,在函数A中不能包括对函数B的定义。正确的定义方法如下:

int A(int a,…)int B(int b,…)

{{

声明部分; B(a,…); 执行部分;声明部分; 执行部分;

}}

(例1-2)

其中,函数A中是可以调用函数B的。

(2) 调用函数和被调用函数

由上例1-2可以看出,函数A在执行的过程中包括了对函数B的调用,则函数A称为调用函数(调用函数B),而函数B被函数A调用,称为被调用函数论文开题报告。

(3) 实参和形参

调用函数中定义的变量是实参,被调用函数中定义的变量是形参。如例1-2,函数A中的变量a是实参,函数B中的变量b是形参。

(4) 实参变量和形参变量之间的独立性

实参变量和形参变量之间只存在值的传递过程,实参变量的存储空间在调用函数中分配,而形参变量的存储空间在被调用函数中分配,被调用函数执行完毕后,其所分配的存储空间被释放,即形参变量的存储空间被释放,它不会返回值给实参变量,也不会参与调用函数的继续执行。例如(实现两个数的交换):

main( ) voidswap(int a, int b)

{{

int a, b; intc;

swap(a,b); c=a;a=b; b=c;

printf(“%d,%d”,a,b);printf(“%d,%d”,a,b);

}}

(例1-3)

显然,函数main是调用函数(调用函数swap),函数swap是被调用函数。main函数中的a,b由main函数分配存储空间,而swap函数中的a,b由swap函数分配存储空间。main函数执行到swap函数时,调用swap函数,swap函数为其变量分配存储空间,然后实现了swap函数中变量a,b的值交换,执行完毕后即释放其分配变量的存储空间。继而,main函数继续执行,但其变量a,b没有做任何改变,即main函数不能实现a,b的交换。由上例可以看出,若单纯的使用变量,则被调用函数无法改变调用函数中的变量值,即swap函数无法实现main函数中变量a,b的交换。

2 指针的有关概念

指针是C语言中功能最强大,使用最广泛的一种数据类型,主要用于描述存储单元的地址。通过使用指针,可以在函数中进行传址调用;规范的使用指针,可以使程序简洁、紧凑、高效。

(1) 指针变量的定义

定义指针变量的一般形式:类型标识符 *变量名;其中毕业论文ppt,变量名前的符号“*”表示将要定义的变量,类型说明符表示该指针变量所指向数据的类型。例如:

int *p1; char *p2;float *p3;

分别定义了整形指针变量p1,字符形指针变量p2,以及浮点形指针变量p3。

(2) 指针变量的引用

&为取地址运算符,该运算符是一个单目运算符,运算结合性为自右至左,它返回其右边变量在内存中的地址。其一般形式为:&变量名,例如:

int x=3,*p; p=&x;指针变量p指向变量x。

在使用x的值时,可以直接使用x,也可以用*p来代替使用x。此外,指针变量一定是和它所对应的变量相互引用,即指针变量在使用时一定要有明确的指向,必须赋予具体的值,否则将可能导致错误。

3 指针与函数的关系

在函数的编写过程中,若单纯的只用变量参数,则无法实现被调用函数改变调用函数中变量值的目的。而为了实现这一目的,就需要函数和指针之间的结合使用论文开题报告。

(1) 引用指针,可以实现调用函数和被调用函数中的指针变量共同指向调用函数中的存储单元,从而实现被调用函数改变调用函数中变量值的目的。例如:

main()void change(int *p2)

{{

int a,*p1;*p2=3;

a=2; p1=&a;}

change(p1);

printf(“the value of a is:%d”,a);

}

由上例可以看出,在调用函数(main函数)中定义了变量a和指针变量p1,被调用函数(change函数)中定义了指针变量p2。程序首先从main函数开始执行,分配变量a和指针变量p1的存储单元,此时指针变量p1指向变量a(p1=&a)。当程序执行到change函数时,程序跳转到change函数执行其函数体,change函数为其指针变量p2分配存储单元,同时p2也得到了p1传过来的值(变量a的地址),此时p2也指向了调用函数中的变量a,即实现了p1和p2共同指向了调用函数中的存储单元(变量a的存储单元),change函数执行其函数体(*p2=3),即使a的值变为3。change函数执行完毕后,释放其变量的存储空间,转而继续执行main函数,此时a的值已经发生改变(由2变为3),实现了被调用函数改变调用函数中变量值的目的。

(2) 调用函数和被调用函数中实参和形参之间的关系图

被调用函数执行完毕后毕业论文ppt,释放它所分配的存储单元,而调用函数分配的存储单元仍继续使用。此外,只有当调用函数中传指针值(即实参是指针值),而被调用函数中引用变量(即形参收到指针值后,在函数体内引用变量值),才能达到改变的目的。

例如,实现变量a和b的交换,程序如下:

main()

{

inta,b,*x,*y;

a=2; b=5;

x=&a;y=&b;

swap(x,y);

printf(“%d,%d”,a,b);

}

void swap(int *x, int *y)void swap(int *x, int *y)

{ {

int *t; int*t;

t=x; x=y; y=t;*t=*x; *x=*y; *y=*t;

} }

(例1) (例2)

例1虽然传的是指针值,但在函数体的执行过程中引用的仍然是指针值(引用x和y),所以不能实现a和b的交换;例2程序传指针值后,引用变量(*x和*y,即a和b),所以能实现a和b的交换。

4 结束语

在以后的编程过程中,若遇到想通过被调用函数改变调用函数中变量值的目的,则可以把该变量的地址值传给被调用函数,从而达到改变的目的。鉴于文章篇幅及个人能力有限,本文肯定还存在许多不足之处,仅供大家学习和参考。

参考文献

[1]谭浩强.C程序设计(第二版).清华大学出版社,2004.

[2]杜友福.C语言程序设计(第二版).科学出版社,2007.

[3]陈志泊,王春玲.面向对象的程序设计语言――C++.人民邮电出版社,2002.

免责声明以上文章内容均来源于本站老师原创或网友上传,不代表本站观点,与本站立场无关,仅供学习和参考。本站不是任何杂志的官方网站,直投稿件和出版请联系出版社。
相关文章
相关期刊
服务与支付
发表咨询 润稿咨询 文秘咨询 购买杂志