汇编语言与C语言比较

2024-07-22

汇编语言与C语言比较(精选12篇)

汇编语言与C语言比较 篇1

摘要:汇编语言是各种CPU提供的机器指令的助记符的集合, 人们可以用汇编语言直接控制硬件系统进行工作。C语言是一种结构化语言。它层次清晰, 便于按模块化方式组织程序, 易于调试和维护。C语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型, 便于实现各类复杂的数据结构。在计算机应用程序的开发中, 对于汇编语言与C/C++语言的设计开发, 二者都存在着优缺点, 本文主要研究了汇编语言与C/C++语言混合编程的设计, 并进行相关的讨论。

关键词:汇编语言,C/C++语言

在计算机系统的应用程序中, 所有汇编任务都由汇编语言来完成, 这样虽然完成任务的效率很高, 但是工作量却非常大, 会影响到对于应用程序的维护。若是所有的程序都是由C/C++语言进行编程, 虽然执行过程比较的简单, 但是这种方式却导致了目标代码的执行任务效率低, 实时性很差。所以在嵌入式系统中, 主要采用的编程方式是汇编语言与C/C++语言混合编程形式, 在编程过程中, 初始化任务由汇编语言来完成, 主要的任务则是由C/C++语言来完成, 从而达到了最大的效果。

1 ARM处理器

ARM处理器主要是利用编译器将汇编语言以及C/C++语言进行相互的切换, 并且ARM制定了相关标准, 来保障切换过程中的顺利实施。

1.1 寄存器使用规则

ATPCS为ARM寄存器进行不同命名, 从而在编程的过程中来利用ATPCS寄存器进行编程。

1.2 堆栈的使用规则

在ATPCS中规定, 堆栈的主要类型是FD, 被称为满递减堆栈, 所以必须要利用STMFD/LDMFF进行堆栈的操作。

1.3 参数传递规则

参数传递的规则不一样, 利用参数的数量可以将子程序分为参数数量固定, 以及参数数量不固定的子程序, 对于参数变化的子程序, 若参数的数量少于四个, 那么要利用寄存器来进行参数的传递, 若参数的数量多余四个, 那么必须要利用堆栈来进行参数的传递, 所以参数之间传递的规则不同。

2 C语言

2.1 汇编语言调用C语言

在对计算机程序的开发中, 前期由汇编语言进行初始化的编程, 然后在进行C语言之间的切换, 对于C语言的切换, 主要是通过BL来实现的。以下是调用的字符:

汇编语言的集成环境如图1所示。

2.2 C语言调用汇编语言

在程序中, 使用“C++”程序来调用C程序, 以下是调用C程序的字符:

2.3 汇编程序调用C++程序

在汇编语言与C++程序的切换时, 必须要利用关键词进行声明, 在C++程序的结构中, 如果没有基类, 则要使相应的存储结构与ARMC相同。并且在汇编过程中将参数的数据放在数据栈中, 只有这样才能使被调用的C++程序访问到相应的参数。

3 混合编程

在进行混合编程的过程中, 若汇编代码较短, 那么可以利用内嵌汇编的方式进行混合编程, 不会直接指定寄存器, 而是直接利用编译器进行分配。主要的内嵌汇编语言如下:

以下是利用字符串复制的方式实现混合汇编:

4 结语

在计算机系统嵌入式应用程序的开发中, 利用ARM汇编语言与C/C++语言相互结合的混合编程方式, 可以在很大程度上提高编程的最佳效果。本文主要举出了ARM汇编语言以及C/C++语言汇编中的实例, 提出了设计的方法, 阐述了ARM汇编语言与C/C++语言相互结混合编程方式的实现。

参考文献

[1]翟乃强, 隋树林.汇编语言与C语言及Visual C++混合编程[J].青岛科技大学学报 (自然科学版) , 2003.

[2]王付山.汇编语言程序设计教学初探[J].福建电脑, 2005.

[3]蒋雪玲.对汇编语言教学的几点建议[J].广西师院学报 (自然科学版) , 2001.

汇编语言与C语言比较 篇2

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

#include “stdafx.h”

#include // 包含stdio.h头文件

int max(int, int); // 函数声明

int main(){

int a,b; // 声明两个整型变量

printf(“input two integer:”);// 以空格为分隔

scanf(“%d %d”,&a,&b);// 将输入的两个整数分别赋值给a, b

printf(“the max integer is %d.n”,max(a,b));// 以整数形式输出最大值, a, b为实际参数(实参)

return 0;

}

// 函数定义

int max(int num1, int num2){ // num1, num2为形式参数(形参)

if(num1>num2){ // 如果num1大于num2

return num1; // 返回num1并结束max函数

}

else

{ // 如果num2大于num1

return num2; // 返回num2并结束max函数

}

单招C语言课程问卷调查与分析 篇3

关键词:C语言;问卷调查;有效教学

单招C语言课程分理论和实践两部分,共140分,是高考专业课程中分值最高学科,但由于其难度大很多学生难取高分,更有甚至直接放弃。所以C语言成了单招生高考的关键学科,为了提高教学质量,进行本次问卷调查,希望从一线资料中为课改提供参考。

一、问卷说明

本次单招C语言课程问卷调查是对当前单招计算机专业两个班学生进行的,高一40人,高三36人,总发放卷数76份,回收71份,有效回收率93.4%,問卷调查中共设计了20小题,主要针对学习现状、学习习惯、教学方法等几方面展开。

二、问卷分析

根据回收问卷,统计分析如下。

1.学前基础

绝大多数学生之前都没学过相关的编程语言,少数学生也只是听说过,因此学生学习C语言的起点是一致的,几乎都为零。

2.学习兴趣

经过一段时间学习,对C语言的兴趣15%学生表示非常感兴趣,73%学生认为一般,12%的学生感到烦恼,也就是说,真正感兴趣的学生不多。

从对“C语言的重要性”认识来看,90%学生都认为“很重要”,但是从重要性的原因看,多数是因为“要考高”,真正因为“对计算机感兴趣”的学生寥寥无几。

兴趣是最好的老师,但调查情况显示,学生对于C语言的重要性还没有真正从学科中来,从发自内心的渴望中来。我们教学中要关注学生兴趣的培养,“乐于学”是学习成功的内因。

3.学习效果

从对“你认为C语言学习难易程度”的问卷结果看,14%的人认为“非常难,听不懂”,55%人认为“比较难,大部分听不懂”,20%的人认为“有一定难度,基本能跟上”,11%的人认为“能跟上老师的节奏,比较简单”。数据显示,C语言对于大多数的人来说是难学的课程。

因此,在问及“学完该课程后,你认为你达到的水平”时,多数人都选择了“能编一些简单程序”,教学效果并非理想。

4.学习习惯

“你有课前预习C语言的习惯吗?”在此项调查中显示,学生几乎都没有预习的习惯,“你上课认真听讲吗?”回答中多数学生上课都会走神,“你有作业缺交吗?”绝大部分写“偶尔”,这些现象说明他们的学习习惯还不够良好。

“你是怎样对待C语言作业的?”在此项问卷中显示,独立完成的占31%,抄作业后弄懂的占38%,抄作业后没弄懂的占27%,不交作业的占4%。这个现象给了我们很大的震撼,一堂课后,真正能弄明白的人真的不多,课后能再次消化的人占一半,而30%的人根本就没懂,长此下去,这些人这门课也就放弃了。提高课堂教学质量是教师的当务之急。

5.教学方面

由于C语言具有丰富的数据结构和算法,“黑板+粉笔”方式是非常传统的教学方式,从问卷看,90%的学生更喜欢实践课,且喜欢“边讲边练”。“纸上得来终觉浅,绝知此事要躬行”,从实践中来的印象更深刻。

6.教学改进意见

在课改意见调查中主要存在两种意见,一种建议增加实践课时,这点正是“如何学好C语言”的看法中提出的主要建议。另一种建议建立网络教学资源库,方便学生自学。这两方面都将成为课改的两大研究方向。

三、C语言课改措施

布鲁姆提出有效教学思想:教师遵循教学活动的客观规律,以尽少的时间、精力和物力投入,实现教学目标和学生的个性培养与全面发展,取得尽可能多的教学效果。教学的有效性包括如下三重意义:(1)有效果;(2)有效率;(3)有效益。以上对于有效教学的解析,正融入我们C课堂教学改革需要的思想精髓。

1.关注学生兴趣的培养,激发学习热情

兴趣是一个古老而又不失活力的话题。从心理学到教育学,从一线教师到专家学者,都对学习兴趣研究投入了极大的热情。从问卷调查看,学生对C语言的兴趣渐行渐远,那么兴趣是否可培养?涂阳军在《论学习兴趣的养成:对西方近二十年来学习兴趣研究的反思》一文中回答道:“学习兴趣是完全可以培养的。”并认为:“在一定程度上,学生学习兴趣的产生受到了外界环境因素的强烈影响,但也包含有‘先天性’成分。”

关于学习兴趣形成这一问题,段作章对其做了更深入全面的研究,他认为:“在发生学看来,学习兴趣的形成发展要经历一个孕育萌发、初步形成、深化发展、巩固完善的过程。学习兴趣萌发于学生觉察到的事物或现象与已有知识经验的相互作用;兴趣的初步形成主要依赖于学生对学习任务的认知加工及其水平;对学习目标、学习动机、价值体系、评价标准的内化是学习兴趣深化发展的关键;创造性地应用知识于实践并从中体验到成功的喜悦,获得知识的迁移,是巩固完善学习兴趣的主要路径。”从这段阐述中,我们发现学习兴趣的培养是不同阶段涉及的关键因素。在教学实践中,我认为教学方法是开展有效教学的关键因素,是激发学生兴趣的关键手段。“教无定法,贵在得法”,只要恰到好处,定能起到作用。

2.加强实践课时,将理论知识在实践中溶解

单招高考C语言理论60分,实践80分,可见高考非常重视C语言实践操作能力考核。本次问卷中,学生强烈要求多开设实践课。从我平时上课的观察来看,实践课的学习状态要好于课堂学习,学习积极性明显高于理论课,碰到问题时,学生之间的交流也是非常热烈的,这种热烈也正反映了他们对学科的兴趣盎然。增设实践课时,将理论知识融于实践,并做好课堂辅导工作,确保每个学生都能及时地得到问题的解答。

3.增设学习辅助平台,比如校园教学资源库建设

在问卷调查中,很多学生提出了建立教学资源库辅助学生课外学习的意见。为此我依托学校教学平台,初步建构了校园C语言教学资源库,其中包括:

(1)教学资源库建设。建立C语言校园教学资源库,方便学生上传下载学习资料及在线学习。主要内容包括:(a)历年高考试卷集。这部分试题难度系数较高,是高考题,每道题都辅以题目、答案、考点和解题技巧,帮助学生课外自学之用。(b)技能试题集。这部分试题主要针对实践用,每题含题目、答案、解题技巧三部分。难度系数由简到难。(c)专题集。本部分主要来源于教材案例,总共有7个专题,方便学生有针对性的学习、解惑。

(2)班级交流群建设。按照班级建立班级群,可即时交流,由学生轮流担当“小老师”,负责答疑解惑。

(3)提供多媒体教学资源。增设学习辅助资源平台,目的是强化学生学习的自主性,增加教学的广度与深度,培养和提高学生提出问题、分析问题和解决问题的能力,做到有针对性地查漏补缺。

四、展望

本次问卷调查给C语言课程改革提出了宝贵的建议并指明了方向,只有把有效的教学思想贯彻于C语言课程,确实能有效地提高教学质量。教学资源库的建设刚刚初具规模,还需后继不断完善和发展,更需要教师从教学实际出发,基于学生的学习情况,开发新的教学课件、教案等资料,促进教师教学相长,提高教学质量。

参考文献:

涂阳军.论学习兴趣的养成:对西方近二十年来学习兴趣研究的反思[J].江苏教育,2013(1).

汇编语言与C语言比较 篇4

关键词:C语言,汇编语言,混合编程,技术

C语言的应用日益广泛, 但是并不代表C语言可以满足所有的汇编要求。在有的用C语言不能进行汇编的工作中, 需要编程技术的不断创新, 让C语言与汇编语言混合, 来满足多种汇编语言的要求。C语言中, 只是一种比较中级的语言。而汇编语言具有:程序代码短, 执行速度快等特点;只有将C语言与汇编语言混合编程混合运用, 才能满足不同的汇编要求。在混合编程中, 也有很多的规定和方法, 以及在实施过程中的具体步骤。笔者主要就C语言与汇编语言混合编程技术的问题进行了研究。

1 C语言介绍

C语言是伴随计算机的发展应运而生上午, 在现在的软件开发领域中得到了广泛应用。当然C语言也是有很多优点的, 比如说它的数据类型较为丰富, 表达能力强, 应用效率比较高, 使用灵活、方便。C语言的功能是很强大的, 它可以涵盖高级语言程序的优点, 还可以具有汇编语言的特点。

1.1 C语言的优点

1.1.1 C语言是一种高级语言

在C语言中, 可以把高级语言的编程程序与低级语言的一些优势相结合, 达到了汇编语言的要求, 可以具备汇编语言的很多特点, 对很多的编程都可以进行。

1.1.2 C语言是一种结构性的语言

结构式的语言的特点就是将代码和数据进行分隔化。结构化的语言就会让很多的语言形成一个结构的特点, 可以使编程的层次性更加清晰, 会使结构程序完全的结构化。

1.1.3 C语言的功能齐全

C语言在不断的发展过程中, 已经融合了很多的数据类型, 而且在后来的发展过程中又引入了指针的概念, 这就大大提高了程序的操作效率。而且, C语言在应用过程中有非常强大的计算功能和逻辑判断能力, 在应用中具有强大的优势。

1.1.4 C语言的使用范围广

C语言不断改进, 现在可以满足多种操作系统, 现在市面上的操作系统, 基本上都可以满足, 它的操作能力有的时候可以优于其它程序, 现在有一些别的编程不能够进行的操作, C语言就可以满足操作要求。

1.1.5 C语言应用指针

可以直接进行靠近硬件的操作, 但是C语言的指针操作不做保护, 也给它带来了很多不安全的因素。C++在这方面做了一定改进, 在保留了指针操作的同时又增强了安全性, 受到了一些用户的支持, 但是, 由于这些改进增加语言的复杂度, 也为另一部分所诟病。Java则吸取了C++的教训, 取消了指针操作, 也取消了C++改进中一些备受争议的地方, 在安全性和适合性方面均取得良好效果, 但其本身解释在虚拟机中运行, 运行效率低于C++/C。一般而言, C, C++, java被视为同一系列的语言, 它们长期占据着程序使用榜的前三名。

在C语言中可分分:基本数据类型、构造数据类型、指针类型、空类型等四个类型。

1.2 C语言存在的不足

1.2.1 C语言的缺点主要表现在数据的封装性上

这一点使得C语言在数据的安全性上具有很大缺陷, 这也是C和C++的一大区别。

1.2.2 C语言的语法限制不太严格, 对变量的

类型约束不够严格, 影响程序的安全性, 对数组下标越界不作检查等

从应用的角度, C语言比其它高级语言较难掌握。也就是说, 对用C语言进行语言编程的技术人员来说, 要求其对程序设计要更加熟练一些。

2 汇编语言介绍

汇编语言是一种符号语言, 它与机器密切相关, 是面向机器的语言, 具有代码短, 占用存储空间小, 运行速度快, 直接控制硬件等优点, 所以它的运行速度是高级语言所不能比拟的。但用汇编语言开发程序, 编程工作量大, 开发周期长, 容易出错, 且不易调试。

汇编语言属低级语言, 而C语言是高级语言, 所谓高级语言就是更容易被人们理解的语言, 其实汇编语言能实现的功能往往也能通过C语言来实现, 甚至用C语言会更简单, 但是汇编语言有一个优势是其它任何语言所不具备的, 这也是为什么汇编语言一直能在编程中占有一席之地, 那就是汇编语言对硬件的直接控制, 也就是说它能直接对硬件操作, 可以绕过操作系统对硬件直接控制。虽然有的领域其它编程也能实现, 但在很多地方往往是汇编语言能更加简单, 更加完美的完成。而且学好了汇编语言你就能对CPU是怎么工作的有了清晰的认识, 所以学计算机专业的一般都要学汇编语言。

人类最容易接受自己每天都使用的自然语言。为了使机器指令的书写和理解变得容易, 需要借鉴自然语言的优点, 为此就引入了汇编语言。汇编语言使用符号来代表不同的机器指令, 而这些符号非常接近于自然语言的要素。基本上, 汇编语言里的每一条指令, 都对应着处理器的一条机器指令。

汇编语言包括两个部分:语法部分和编译器。语法部分提供与机器指令相对应的助记符, 方便指令的书写和阅读。当然, 汇编语言的符号可以被人类接受, 但不能被处理器识别。为此, 还要由汇编语言编译器将这些助记符转换成机器指令。

根据应用领域的不同, 处理器的种类较多, 比如用于工业控制和嵌入式计算的Z80、MC68000和MCS-51, 广泛应用于个人计算机的INTELx86系列, 以及基于ARM体系结构的处理器, 包括苹果公司在内的大企业都是ARM的客户。在市场上, ARM处理器是最受欢迎的32位嵌入式处理器, ARM处理器比INTEL奔腾系列卖得快的多, 基本上是3∶1的比例。

不同的处理器有不同的指令集。正是因为这个原因, 每一种处理器都会有自己专属的汇编语言语法规则和编译器。即使是同一种类型的处理器, 也可能拥有不同的汇编语言编译器。一个明显的例子是INTEL x86系列的处理器, 围绕着它就可以开发出多种编译器来, 如MASM、NASM、FASM、TASM和AT&T等。而且, 每一种编译器, 使用的语法也不同。

2.1 汇编语言中的优点

2.1.1 使用汇编语言, 可以访问所有能够被访问的软、硬件资源

因为用汇编语言设计的程序最终被转换成机器指令, 故能够保持机器语言的一致性, 直接、简捷, 并能像机器指令一样访问、控制计算机的各种硬件设备, 如磁盘、存储器、CPU、I/O端口等。

2.1.2 目标代码简短, 占用内存少, 执行速度快

汇编语言经常与其它高级语言配合使用, 以改善程序的执行速度和效率, 进而弥补了高级语言在硬件控制方面的不足, 其应用十分广泛。

2.2 汇编语言存在的不足

2.2.1 汇编语言是面向机器的, 处于整个计算

机语言层次结构的底层, 故被视为一种低级语言, 它通常是为特定的计算机或系列计算机专门设计的

因此, 不同的处理器有不同的汇编语言语法和编译器, 编译的程序无法在不同的处理器上执行, 缺乏可移植性;

2.2.2 难于从汇编语言代码上理解程序设计意图, 可维护性差

即使是完成简单的工作也需要大量的汇编语言代码, 容易产生bug, 难于调试;

2.2.3 使用汇编语言必须对某种处理器非常了

解, 而且只能针对特定的体系结构和处理器进行优化, 开发效率较低, 周期长且单调。

3 C语言与汇编语言的不同点

它们的指令集, 寻址方式不同, 相当于两个机器各有各自的操作方式。汇编语言是低级语言, 在编写程序的时候会根据不同的情况指定使用不同的寻址方式, 能够对内存和CPU里的通用寄存器直接操纵;不同的计算机系列会有不同的汇编语言。而C语言是高级语言, 可以实现跨平台。编写程序无需指定CPU的指令执行情况, 一段程序可以在不同体系结构的计算机上使用汇编的低级别语言, 优点在于能够对硬件资源进行准确的操作, 比如寄存器的使用和数据存储的具体位置。能充分运用硬件资源。但编写程序较为复杂, 程序阅读麻烦。

4 C语言与汇编语言混合编程的一般方法

对于LF240x A的混合编程主要有三种方法:

(1) 对C语言程序编译后形成的汇编程序进行手工修改与优化;

(2) 在C语言程序中直接嵌人汇编语句;

(3) 分别编写C语言程序和汇编语言程序, 然后独立编译成目标代码模块, 再进行链接。第一种编程方式要求对汇编语言与C语言要特别熟悉, 并且这样的编程方式对程序的可读性和扩展性的负面影响较大, 一般不建议使用。第二种方法适用于语句执行频率较高, 且C编程与汇编编程效率差异较大的情况, 例如进入中断的通用中断子程序等。第三种方式是混合编程最常用的方式之一, 在这种方式下, C语言程序与汇编语言程序均可使用另一方定义的函数与变量。下面重点介绍后两种方法:

4.1 C语言程序中嵌入汇编语言

C语言程序支持asm指令, 所以可以利用这条指令直接将汇编语句嵌入到C语言程序中。LF240x A中一些C语言无法操作的控制位, 可以采用这种方式来实现。这种方法只需在汇编语句两边加上双引号并用小括号括起来, 前面再加上asm关键字, 即“asm (“汇编语句”) ;”。需要注意的是, 汇编语句不能紧挨着前一个双引号, 它们之间必须用空格、Tab或标号开头。例如, 在汇编语言中开中断指令SETC INTM, 嵌入到C语言中为“asm (“SETCINTM”) ;”。这种方式虽然操作简单, 但是汇编代码很有可能破坏原来的C语言环境, 从而导致不可预料的结果。因此, 只提倡在程序开始的系统初始化部分少量使用, 而在C语言中嵌入实现某一完整功能的多句汇编语言时, 不宜采用此种方式。

4.2 C语言与汇编语言程序相互调用

4.2.1 C语言程序调用汇编函数

C语言程序中调用的汇编函数, 在汇编语言中其名称以程序标号的形式出现。程序标号作为操作数用global进行定义, 在前面加下划线“_”。汇编函数也可以利用累加器给C语言程序传递返回值。

LF240x A有8个辅助寄存器 (AR0~AR7) 可供使用, 在C语言环境中这些寄存器都有明确的区分。

4.2.2 汇编语言程序调用C函数

汇编语言程序中调用C函数。被调用的C函数在C语言环境中需要用extern进行定义, 在汇编程序中用ref说明为外部标号, 且函数名加“_”。在调用C函数之前应手工编程将参数以逆序写入当前运行任务所使用的任务堆栈中, 压栈之前堆栈指针可不作调整。被调用的C函数即可正常访问调用者传递的参数, 函数调用完毕后需调整堆栈指针, 清除函数调用中参数所占用的堆栈空间。C函数的返回值可以通过访问累加器获得。

4.3 应注意的事项

4.3.1 中断的处理

LF240x A发生中断时, 程序指针 (PC) 就指向相应的中断向量, 并通过中断向量映射到相应的中断服务子程序。例如, 在0004h~0005h处是INT2的中断向量, 在此存储了1条跳转指令, 跳转至INT2的服务子程序。LF240x A的C语言有interrupt修饰符可以用来定义中断服务子程序。

4.3.2 字母大小写

在C语言环境中, 对于字母大小写的区分是很严格的, 因此在混合编程的过程中也应该严格遵守这一点。例如, 在写命令文件时, 如果将“data”写成“.da TA”, 此时系统将无法给初始化代码分配存储空间, 导致程序无法执行。

4.3.3 C语言库函数应用

TI的C编译器中内置了很多函数, 包含在rts2xx.1ib的函数库中。库函数并不是C语言的一部分, 它是由人们根据需要编制并提供给用户直接使用的。每一种C编译系统都提供了一批库函数, 不同的编译系统所提供的库函数的数目、函数名及函数功能是不完全相同的。要使用库函数, 只需在源文件中添加语句“#include”函数名.“h”, 就可使用相应的库函数了。

4.4 C程序中内嵌汇编指令行嵌入方法

可在C程序中直接嵌入汇编指令, 它就好像C程序的语句一样, 当C语言程序中想直接控制硬件或加快运行速度, 用较短的汇编程序实现时, 可采用这种方法, 其具体方法是:

(1) 在嵌入汇编指令前, 必须用关键字asm说明;

(2) 内嵌式汇编指令中的操作数;

(3) 汇编指令操作数也可以是结构数据。

4.5 C语言与汇编语言混合编程的方法

通常把组合两种或两种以上程序设计语言, 通过相互调用、参数传递、共享数据结构和数据信息而形成程序的过程叫做混合编程。混合编程中的关键问题是建立不同语言之间的接口, C语言和汇编语言混合编程可分为:C程序内嵌汇编指令、C程序调用汇编语言子程序和汇编语言调用C函数三种方法。

4.6 C语言与汇编语言混合编程的约定规则

(1) 命名约定;

(2) 声明约定;

(3) 寄存器使用约定;

(4) 储存模式约定;

(5) 参数传递约定。

5 结束语

C语言与汇编语言的相互结合, 混合编程将两者的优点有机融合, 可以满足更多的编程要求, 彼此相互调用, 进行参数的传递, 是一种很有效很实用的编程方法。这种混合编程可以发挥各自的优势, 达到很好的使用效果。虽然在混合编程中可能还存在一些的问题, 但只要在实践中多实践、多积累经验, 就会避免出现错误, 就会取得理想的效果。

参考文献

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

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

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

七:结构与联合(C语言) 篇5

在实际问题中,一组数据往往具有不同的数据类型,例如, 在学生登记表中,姓名应为字符型;学号可为整型或字符型; 年龄应为整型;性别应为字符型;成绩可为整型或实型。 显然不能用一个数组来存放这一组数据。 因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构”。 它相当于其它高级语言中的记录。

“结构”是一种构造类型,它是由若干“成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。 结构既是一种“构造”而成的数据类型, 那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义函数一样。

一、结构的定义

定义一个结构的一般形式为:

struct 结构名

{

成员表列

};

成员表由若干个成员组成, 每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为:

类型说明符 成员名;

成员名的命名应符合标识符的书写规定。例如:

struct stu

{

int num;

char name[20];

char sex;

float score;

};

在这个结构定义中,结构名为stu,该结构由4个成员组成。 第一个成员为num,整型变量;第二个成员为name,字符数组;第三个成员为sex,字符变量;第四个成员为score,实型变量。 应注意在括号后的分号是不可少的。结构定义之后,即可进行变量说明。 凡说明为结构stu的变量都由上述4个成员组成。由此可见, 结构是一种复杂的数据类型,是数目固定,类型不同的若干有序变量的集合。

二、结构类型变量的说明

说明结构变量有以下三种方法。以上面定义的stu为例来加以说明。

1. 先定义结构,再说明结构变量。如:

struct stu

{

int num;

char name[20];

char sex;

float score;

};

struct stu boy1,boy2;

说明了两个变量boy1和boy2为stu结构类型。也可以用宏定义使一个符号常量来表示一个结构类型,例如:

#define STU struct stu

STU

{

int num;

char name[20];

char sex;

float score;

};

STU boy1,boy2;

2. 在定义结构类型的同时说明结构变量。例如:

struct stu

{

int num;

char name[20];

char sex;

float score;

}boy1,boy2;

3. 直接说明结构变量,

例如:

struct

{

int num;

char name[20];

char sex;

float score;

}boy1,boy2;

第三种方法与第二种方法的区别在于第三种方法中省去了结构名,而直接给出结构变量。三种方法中说明的boy1,boy2变量都具有图7.1所示的结构。说明了boy1,boy2变量为stu类型后,即可向这两个变量中的各个成员赋值。在上述stu结构定义中,所有的成员都是基本数据类型或数组类型。成员也可以又是一个结构, 即构成了嵌套的结构。例如,图7.2给出了另一个数据结构。 按图7.2可给出以下结构定义:

struct date{

int month;

int day;

int year;

}

struct{

int num;

char name[20];

char sex;

struct date birthday;

float score;

}boy1,boy2;

首先定义一个结构date,由month(月)、day(日)、year(年) 三个成员组成。 在定义并说明变量 boy1 和 boy2 时, 其中的成员birthday被说明为data结构类型。成员名可与程序中其它变量同名,互不干扰。结构变量成员的表示方法在程序中使用结构变量时, 往往不把它作为一个整体来使用。

在ANSI C中除了允许具有相同类型的结构变量相互赋值以外, 一般对结构变量的使用,包括赋值、输入、输出、 运算等都是通过结构变量的成员来实现的。

表示结构变量成员的一般形式是: 结构变量名.成员名 例如:boy1.num 即第一个人的学号 boy2.sex 即第二个人的性别 如果成员本身又是一个结构则必须逐级找到最低级的成员才能使用。例如:boy1.birthday.month 即第一个人出生的月份成员可以在程序中单独使用,与普通变量完全相同。

结构变量的赋值

前面已经介绍,结构变量的赋值就是给各成员赋值。 可用输入语句或赋值语句来完成。

[例7.1]给结构变量赋值并输出其值。

main{

struct stu

{

int num;

char *name;

char sex;

float score;

} boy1,boy2;

boy1.num=102;

boy1.name=“Zhang ping”;

printf(“input sex and scoren”);

scanf(“%c %f”,&boy1.sex,&boy1.score);

boy2=boy1;

printf(“Number=%dnName=%sn”,boy2.num,boy2.name);

printf(“Sex=%cnScore=%fn”,boy2.sex,boy2.score);

}

本程序中用赋值语句给num和name两个成员赋值,name是一个字符串指针变量。用scanf函数动态地输入sex和score成员值,然后把boy1的所有成员的值整体赋予boy2。最后分别输出boy2 的各个成员值。本例表示了结构变量的赋值、输入和输出的方法。

结构变量的初始化

汇编语言与C语言比较 篇6

关键词:C语言;程序调试;常用技巧;常见错误

中图分类号:TP312.1 文献标识码:A 文章编号:1674-7712 (2012) 18-0032-01

当我们完成了C语言程序的源程序的编写之后,我们要使用C语言的编译器将其翻译成计算机能够执行的二进制代码形式的目标程序,再通过连接,最终形成可执行程序。但这个过程中可能会出现各类问题。比如编译未通过,连接未通过,或是生成了可执行程序,但并非我们的预期目标。

所谓程序调试,是指对程序的查错和排错。调试程序一般应经过人工检查,即静态检查;上机调试,即动态检查;运行程序,试验数据及检查和分析错误原因等几个步骤。

程序调试是一项细致深入的工作,需要下功夫、动脑子、善于累积经验。在程序调试过程中往往反映出一个人的水平、经验和科学态度。上机调试程序的目的决不是为了“验证程序的正确性”,而是“掌握调试方法和技术”。

一、调试过程中的一些常用技巧

1.先简后繁。先用一组简单的数据对程序进行测试,检验各函数是否有出错现象,然后用复杂数据对程序进行调试,直到确定程序对正常数据没有错误为止。

2.由大到小。出现错误时,要逐步缩小可能出现错误的范围,从整个程序到指定函数,再到指定区域,再到指定行。在对程序缩小范围或对编译没通过的程序缩小错误范围时可以用发“/* */”来进行调试,确定正常范围,缩小错误范围。

3.单步调试。编辑完C语言源程序并保存后,右按F8键进行主函数程序单步执行,如果源程序无语法错误,则每按一次F8键执行一句主函数程序,同时可用Ctrl+F7组合键设置所要跟踪的变量,以查看程序的执行进程,从而更容易查出程序的错误。但是,F8键只能单步执行主函数程序,它将调用非主函数视为一条语句执行,并不能转到被调函数的内部进行语句单步运行,所以在有些程序出错时,不能精确查出出错位置。因此,当主函数调用其它函数时,应当使用F7键,它能在F8键功能的基础之上,进一步深入到被调用函数内部,从而真正做到程序单步执行,即每按一次F7键,仅执行一条语句,遇到函数调用就转到被调用函数内部执行语句。当使用F8或F7进行单步调试时,应当用Ctrl+F7进行变量跟踪。

4.设置断点。断点就是程序运行中可能会中断的地方,方便开发者在程序运行的过程中查看程序当前的运行状态,比如变量的值、函数的返回值等等。F9用于在当前光标所在前行下断点,如果当前行已经有断点,则取消断点。有的地方不能下断点,比如空行、基本类型定义语句(未初始化)等等非执行语句。

二、常见错误分析

在实际的C语言编程过程中可能会出现各种各样的错误。这其中可能有算法错误,有因为对C语言中的某些语法知识理解的不正确而产生的错误,还有因为疏怱大意而产生的程序的录入错误等等。这些错误中,算法错误必须经过后期的试运行和调试才能解决,而其他错误是可以经过训练能够避免的。

(一)由于语法知识理解不正确而导致的错误

这类错误有时并不能被马上发现,因为有些情况下错误会被编译器识别并报错,而有些却不能被编译器识别,但运行结果却和预计的情况不一致。以下是在这方面常见的一些出错的情况。

1.转义字符的用法不当。决不能用的字符是由单个字符组成,而转义字符却是很特殊的一类字符,它是以一个键盘符号反斜杠“\”开始后跟上单个字符或是若干个字符组成的,通常用来表示键盘上的控制代码或特殊符号,例如回车换行符、响铃符号等。程序设计过程中有时不能正确地区分转义字符和普通字符。

2.有符号型转换成无符号型。在数据类型中,有时候会遇到将有符号的数据转换成无符号的数据。要想解决这个问题,我们一定要明白数据在计算机中是如何存储的。数据在机器中的存储是以二进制补码形式存储,正数的符号“+”用二进制0表示,而负数的符号“-”用1来表示,正数的原码补码相同,但是负数的补码是其原码的二进制位取反加1。这样来回转换很麻烦,也容易搞错。

3.“%”的连续使用。在C语言中“%”作为格式描述字符用在输入输出语句中,当我们需要将多个 “%”一起作用时则应特别注意。

4.break语句和continue语句。如果程序设计者搞不清楚break语句和continue语句,没有真正理解两者的含义,所以也容易犯错误。这两个语句都可以用在循环语句中,但两者的作用不同。break语句主要的作用是用来跳出该循环,提前结束循环,接着执行循环语句下面的语句;而continue语句主要作用是结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。

5.函数参数值传递。在函数参数传递的过程中,很多设计者很容易搞错实参在什么时候值不变,什么时候传值后改变。

6.带参宏定义的展开。C语言中带参的宏定义虽然看上去很简单,如果没有真正理解宏定义的话,在宏展开的时候很容易搞错。宏定义是通过#define开头的编译预处理命令来实现,在调用宏的时候要进行展开,并且再用实参去代换形参。

(二)录入过程中常见的错误

在源程序编辑过程中由于疏怱大意而产生的录入错误在所有的错误中不在少数,甚至占更大的比例,常见的错误有误把“=”作为“等于”比较符;使用自加(++)和自减(--)运算符时出错;混淆字符和字符串的表示形式;语句后面漏分号;输入输出的数据的类型与所用格式说明符不一致;忘记定义变量;未注意int型数据的数值范围;输入时数据的组织与要求不符;在不该加分号的地方加了分号;输入变量时忘记使用地址符;括弧不配对;switch语句的各分支中漏写break语句;引用数组元素时误用了圆括弧;对应该有花括弧的复合语句,忘记加花括弧;在用标识符时,忘記了大写字母和小写字母的区别;在定义数组时,将定义的“元素个数”误认为是“可使用的最大下标值”;误以为数组名代表数组中全部元素;对二维或多维数组的定义和引用的方法不对;混淆字符数组与字符指针的区别;用指针变量之前没有赋值;不同类型的指针混用;所调用函数在调用语句之后才定义,而又在调用前未加说明;将函数的形参和函数中的局部变量一起定义;函数的实参和形参类型不一致;没有注意函数参数的求值顺序;混淆数组名与指针变量的区别;误认为形参值的改变会影响实参的值;混淆结构体类型与结构体变量的区别,对一个结构体类型赋值;使用文件时忘记打开,或打开方式与使用情况不匹配。

以上只是列举了一些初学者常出现的错误,这些错误大多是由于对C语言的语法不熟悉造成的。对C语言使用多了,熟练了,错误自然就会减少了。在深入使用C语言后,还会出现其他一些更深入、更隐蔽的错误。

参考文献:

[1]韩京洋,向志强.C语言调试技巧[J].电脑编程技巧与维护,2012,16.

汇编语言与C语言比较 篇7

关键词:C,汇编语言,调用

1 引言

C语言是一种介于高级与低级之间的中级语言,以其数据类型丰富、语句精炼灵活、效率高,表达力强以及可移植性好等诸多优点,成为目前倍受欢迎的一种编程语言。它有丰富的库函数,也可以使用BIOS和DOS的中断功能调用,完成许多由汇编语言完成的工作。但在对速度要求较高的场合,以及在访问计算机系统的硬件资源或接口地址的读写等方面,却显示出了明显的不足。汇编语言作为一种符号语言,具有代码短,占用内存空间少,装载运行速度快,并能对硬件资源进行直接控制等优点,对位、字节和地址进行操作的功能,成为最受欢迎的编程语言之一。但其编程工作量大,开发周期长,容易出错且不宜调试。事实上没有一种编译程序所产生的目标代码能够像汇编程序那样高效和紧凑。大多数情况下,这种小差别无关紧要,但在某些特殊情况下,对程序的空间和时间要求很高的场合,如浮点数计算软件包就是用汇编语言写的,因为它使用频繁,并且很大程度上影响着使用这些程序的执行速度。所以有时需要使用汇编语言编写程序,来满足应用程序中局部的特殊要求。使用C语言和汇编语言混合编程,两种语言的程序相互调用,进行参数传递,共享数据结构及数据信息,这样能充分发挥各语言的优势和特点,提高程序的运行速度和效率以及应用软件的效率。基于上述情况,将两者有效结合,混合编程,扬长避短,是一种行之有效的程序设计开发方法。

2 混合编程的调用规则

(1)参数传递的次序与它们出现的次序是相反的。

(2)传递完参数后,C语言还将保存(CS,IP)。如果C语言是SMALL或COMPACT存储模式下编译的(或者过程是NEAR型的),那么只保存IP,而在MEDIUM、LARGE或HUGE模式下编译的(或者过程是FAR型的),那么CS和IP都会被压入堆栈,其顺序是CS在前,IP在后。不过这个过程是C语言自动进行的而不需要干预。

(3)还有BP也必须保存在堆栈中,然后才可以通过BP和偏移地址来访问参数。

(4)最后一条指令应当是后面不带数字的RET,因为堆栈到原始位置的工作将由C程序重新获得控制权以后才会执行。

(5)任何与C语言共享的名称都必须在前面加下划线,而且C语言只识别前8个字符。

(6)对于普通的参数C语言传递的是参数值,而对于数组,传递的是指针(也就是数据的地址)。

(7)如果C语言是在MEDIUM、LARGE或HUGE模式下编译的,那么汇编语言过程应该设为FAR型;C语言是SMALL或COMPACT存储模式下编译的,那么汇编语言过程应该设为NEAR型。

不过在MASM5.1或TASM1.0及更高的版本的情况下就不必担心偏移地址、在共享名称前加下划线并保存BP这些琐事,因为它们可以由编译器自动完成。

3 汇编语言中调用C语言函数

内嵌汇编不用单独编辑汇编语言文件,比较简洁,但是有诸多限制,当汇编语言的代码较多时一般放在单独的汇编文件中。这时就需要在汇编语言和C语言之间进行一些数据的传递,最简便的办法就是使用全局变量。在汇编语言中调用C语言的函数,需要在汇编中IMPORT对应的C语言的函数名,然后将C语言的代码放在一个独立的C语言文件中进行编译,剩下的工作由连接器来处理。

mingw编译系统在所有C语言符号前加了一个下划线前导符。所以在汇编代码中要用extern指令进行特殊处理。还是用实例来说明比较直观。假设分别建了两个文件,一个是Calc.c,另一个是Call Calc.asm,两个文件中各有一个函数。

Calc.c中内容为:

Call Calc.asm中的内容为:

add()函数接受两个整型参数,相加后返回给调用者,返回值按照C语言调用约定存放在EAX寄存器中;在汇编代码中要先要用extern关键字将_add声明为外部符号,然后才能在程序中使用。这里只需要知道C的符号规则是要加一个前导下划线就可以了。在调用的地方用的也是call_add。

4 在C语言中调用汇编

4.1 汇编函数

在C语言中调用汇编文件中的函数,要做的主要工作有两个,一是在C语言中声明函数原型,并加extern关键字;二是在汇编中用EXPORT导出函数名,并用该函数名作为汇编代码段的标识;最后用mov pc,lr返回。然后,就可以在C语言中使用该函数了。从C语言的角度,并不知道该函数的实现是用C语言还是汇编。更深的原因是因为C语言的函数名起到表明函数代码起始地址的左右,这个和汇编的label是一致的。

在这里,C语言和汇编语言之间的参数传递是通过AT-PCS的规定来进行的。简单地说就是如果函数有不多于4个参数,对应的用R0-R3来进行传递,多于4个时借助栈,函数的返回值通过R0来返回。

4.2 汇编代码

在C中调用汇编代码规则:

(1)内嵌的汇编语句可以用“;”结束,也可以用换行符结束,一行中可以有多个汇编语句,相互间用“;”分隔,但不能跨行书写。

(2)必须使用C语言的注释分隔符“/*”和“*/”。

(3)将masm.exe宏汇编程序拷贝到Tubro C目录下,并重命名为Tasm.exe。

(4)对内嵌汇编指令的C源程序进行编译、连接,格式为:TCC.B.XXX文件名库文件名。

其中,XXX为库文件所在目录的路径,文件名是内嵌汇编指令的C源程序的文件名。

(5)在汇编语言中使用寄存器时,不区分大小写,且只能是8086提供的寄存器名,但在C程序中使用汇编语言的寄存器时,要用大写且前面加一个下划线。

假设有两个文件,一个是Simple Ret.asm,一个是Call Asm.c。

运行结果将会打印1。

所有的要点就是C语言调用约定和global关键字以及extern关键字的使用,global将符号导出给链接器extern声明外部的符号。

5 结语

C语言与汇编语言混合编程,彼此相互调用,进行参数传递,共享数据结构及数据信息,是一种有效的编程方法,但在实际运用中要注意内存模式以及寄存器的分配给程序带来的影响,并且还应考虑到这样做可能会丧失源程序的可移植性。所以,在具体开发设计阶段,应该综合考量各语言的特点,权衡利弊,才能设计出优秀的程序。

参考文献

[1]谭浩强.语言程序设计.第二版[M],北京:清华大学出版社,1999.

[2]沈美明,温冬蝉编著.IBM-PC汇编语言程序设计[M].北京:清华大学出版社,1994.

[3]孙振业,史宝慧编著.C语言及应用.电子科技大学出版社,1999.

汇编语言与C语言比较 篇8

1 汇编语言与C语言的混合编程方法

1.1 C语言调用汇编语言子程序

在C语言程序中调用汇编指令较多的情况下可以采用直接调用汇编语言子程序的格式, 而且由于C语言编译系统要具有约定的段序以及规定的段组合。因此, 要实现C语言对汇编语言子程序的调用, 汇编语言必须严格遵守编译系统的约定或要求的组合和段顺序。C语言调用汇编子程序必须遵循以下规则。

一是程序内需要使用“EXTERN”关键对函数显示进行说明, 并将此作为建立C语言与汇编子程序的接口, 而且函数的名字必须在8个字符以内, 而且函数名设置为下划线格式。二是根据参数在参数标准的顺序, 依据反序作顺序, 依次将参数压入栈中。最后一个参数首先进栈, 最后一个参数在栈中的地址最高。三是依据参数的值进行传递;四是对代码段进加以说明, 并且使用—TEXT作为加代码段命名原则。过程名前加下划线, 并且是公共过程pulic-过程名。根据C程序模式大小确定汇编使用远过程或近过程, 小模式对应近过程, 大模式对应远过程。五是汇编程序的参数取C程序的参数。由于远过程在返回地址时需要占用4个字符, BP压入需要占用2个字符, 因此首个参数需要位于BP+6指向的远远。而近过程第一个参数则位于BP+4指向的单元。六是汇编程序需要兼顾保护寄存器。C语言调用编程语言子程序会导致寄存器变量超过2个, 而多余部分会自动转入栈中存储。因此, 汇编过程必须严格遵守以下开头和结尾格式:

PUSH BP

MOV BP, SP

PUSH SI

PUSH DI

语句

POP SI

POP BP

RET

1.2 汇编语言调用C语言子程序

由于汇编语言的巨大优势, 在汇编程序中可以实现调用C语言子程序。汇编语言调用C语言子程序不需要改变汇编语言主程序和子程序的格式, 只需确保主程序和子程序的格式相同, 并且在程序开始前加入“EXTREN函数名”即可。表明该函数是用来调用C语言子程序的外部函数。而对外部函数可通过主过程中CALL语句进行调用, 并将CALL语句格式设置为“CALL NEAR PTR函数名”。如果子程序为C语言子程序, 并且C语言子程序中只包含C函数, 则不需要使用EXTERN说明。

1.3 C语言程序嵌入汇编语言

C语言嵌入汇编语言中有C程序调用汇编子程序模块以及在C程序中嵌入汇编指令两种。两种嵌入方式分别应用在不同的情况。

第一, C程序条用汇编子程序模块的嵌入方式中的模块划分原则:为完成任务的需求, 每个模块的体现形式为函数或者过程, 再根据模块的特点选择编写语言进行编写。如果主程序的编写包含C语言, 而模块使用汇编语言进行编写, 则需要使用C程序调用汇编子模块。具体操作方法为分别编写汇编C主程序和汇编子程序, 并依据各自的特点形成符合自身编写语言的目标代码模块, 再将目标代码模块相互连接从而形成最终的可执行文件, 通过执行可执行文件即可实现C程序调用汇编子程序模块。

第二, 在C程序中嵌入汇编指令多用于C语言无法实现对硬件控制的情况。例如对寄存器的值、中断标志寄存器的修改、重复使用某种功能、对时间的要求等等, 可通过在C程序中嵌入汇编指令去实现。使用C程序中嵌入汇编指令时需要注意换行符、寄存器的命名、修改编译连接的命令以及拷贝MASM EXE程序, 存储在Turbo C目录下, 并命名为TASM.EXE进行编译。

2 C语言与汇编语言连接的关键问题

混合使用汇编语言和C语言进行编程还需要解决参数传递、调用关系的确定以及汇编程序与C程序的模块连接三个问题。

在参数传递上, 参数传递是混合编程过程中必须解决的问题, 通常情况下采用堆栈实现参数传递。首先, 将汇编语言中的BP作为基址寄存器, 调用程序将按照反序C语言中的参数压入堆栈中, BP加上不同的偏移量就可以实现对参数的使用。

在调用关系的确定上, 需要实现说明需要调用的函数或过程, 并建立相应的调用及被调用关系。其中被调用的函数或过程为外部类型, 可被外部模块引用。调用程序内也需要说明被引用外部模块的名称。

在汇编程序与C程序的模块连接上, 为确保正确连接, 不仅需要确保不同语言模块的存储模式具有一致性, 还需要汇编模块遵守C兼容的函数和变量命名约定。

3 结语

汇编语言和C语言具有不同的优点和缺陷, 混合汇编语言和C语言进行编程可取长补短, 同时发挥两种语言的优势, 并且弥补两种语言的不同, 实现参数传递、数据共享, 而且具有事半功倍的效果。

摘要:汇编语言和C语言是两种不同的编程语言, 软件开发过程中采用两种语言混合程序设计技术可以极大的提高工作效率以及程序的性能。文本首先简单介绍C语言调用汇编语言子程序、汇编语言调用C语言子程序、C语言程序嵌入汇编语言三种常见的混合编程方法, 在混合编程中还需要注意参数传递、调用关系的确定以及汇编程序与C程序的模块连接三个问题。

关键词:汇编语言,C语言,混合程序设计

参考文献

[1]杜钦生, 楚叶峰, 唐伎玲.基于ARM的汇编语言与C语言混合编程的方法研究[J].长春大学学报, 2011 (10) .

[2]柴孝.C语言与汇编语言的混合程序设计技术[J].信息与电脑 (理论版) , 2011 (11) .

[3]林法.基于汇编语言与C/C++语言混合编程的设计研究[J].电子技术与软件工程, 2014 (04) .

C语言创新教学与实践 篇9

C语言是一门面向大一新生的通识课程, 旨在培养学生的逻辑思维能力和创新实践能力, 为后续专业课程的学习奠定良好的基础。

然后, 由于高中教学模式的强化应试训练, 学生的应变贯通能力有限, 学习缺乏主动性和能动性, 仅凭教师“ 灌输式”的教学, 即便技艺高超, 也很难达到预期的目标。 因此, 我们必须从学生的实际出发, 认真分析学情, 建立以学生为主体, 能力为本位的教学理念, 变“ 课堂”为“ 学堂”, 激发学生的学习热情和求知欲, 变“ 被动”为“ 主动”, 以达到“ 授人于渔”、“ 教学双赢”的教学效果[1,3,4]。

1 存在的教学弊端[4]

1.1 实践教学环节松软, 走于形式

由于学生的知识层次差异, 缺乏主动学习、创新性和行业竞争力, 而对于掌握一门算法类编程语言来说, 动手实践是一个非常重要的环节。如果只停留在对知识的理论学习而不进行及时的动手操作和调试, 是学不好程序设计课程的, 也是不可能真正掌握程序设计的灵魂———算法。因此, 为了加深对理论知识和技能知识的理解, 必须将课堂引入到“ 教学做”一体化的教室中去, 让学生边听、边学、边练, 以当场消化课堂所学。

1.2 实训内容模板化, 缺乏创新能力的培养

首先, 实训内容偏向验证性, 缺乏激发学生的创造性思维;其次, 教师干预太多, 使学生处于一种被动学习的状态。

1.3 课程考核模式单一, 缺乏激励机制

传统考核模式以知识点的考核为主, 内容相对局限, 无法综合考察学生知识结构和时间能力, 因此有的学生虽然成绩优异, 但是专业技能仍然不过关, “ 高分低能”的现象十分普遍。

1.4 学生缺乏互助学习能力, CVCC团队协作意识薄弱

目前多数软件项目以团队形式研发, 团队团队成员之间的沟通协作效率对于软件开发成果影响较大。传统实践教学模式下, 学生忙于应付作业, 缺乏团队合作的机会, 更谈不上互助学习和团队协作了。

2 教学实践

2.1 将cvcc能力融入到课堂教学中, 践行互助学习型课堂教学模式, 变课堂为“ 学堂”

结合ACM ( 大学生程序设计竞赛) 和CVCC ( 职业核心能力) 模式, 将学生进行分组, 2~3 人一组, 秉承“ 快乐编程、强弱搭配”的宗旨, 相互协作, 共同协作完成每次的课堂任务, 以培养学生的团队协作能力, 在课堂中采用“ 情景导入-自主学习-成果展现-教师点评-反馈练习” ( 图1 所示) 教学模式, 提升团队整体对计算机程序设计的兴趣和热情。

第一, 任务情景导入[2]。通过创设趣味化的生活问题情境进行教学导入, 抛出主题设计思路, 激发学生的探知欲和分析问题的思维。

第二, 团队自主学习。各小组成员根据任务进行剖析、讨论, 理顺解题思路 ( 即算法) 后, 利用已有的技能点加以代码实现, 并进行整理做好回报展示。

第三, 成果展示[2]。 小组自主学习完毕后, 派代表进行成果展示, 另外采用“ 强弱组合”的组队原则, 组内表现优秀的学生对学习困难的学生进行帮助, 这种做法不仅能促进学困生的进步和成长, 提升他们的学习兴趣, 而且能进一步挖掘和加深优秀成员对问题的理解能力。

第四, 教师点评。 针对本问题情景所涵盖的知识点和技能点, 进行问题剖析、点评和知识拓展, 并进一步引导学生进行思考, 让学生讨论和探究问题, 分析算法的优劣, 从而教会学生学会学习。

第五, 反馈训练。 围绕知识目标和技能目标, 设计相关趣味化的生活情景进行强化巩固训练。 在训练巩固的过程中, 仍采取小组互动、学生互助的方式。

2.2 践行ACM机制的实践教学模式, 让学生在学习中体验乐趣

①将实训内容按照难易程度进行分级分层。 针对不同的学生, 设计不同的题目, 采用简单题和复杂题相结合, 以满足不同层次学生的学习需求。

传统的实训内容通常是按照知识点来安排的, 每个知识点的题目对所有学生都是相同的, 这种“ 一刀切”的实训模式, 使得基础差的学生无法按时完成, 而基础扎实的又觉得学无所得, 总之难以满足个性化的学习需要。 而ACM平台就实现了这一需求。 它根据学生能力水平的差异, 对同一个知识点按难度等级设计出不同的题目, 为学生提供了更多选择。 底子比较扎实的学生可以安排一些应用型或综合型的题目, 以满足不同水平学生的学习需要。 考核时要求学生完成一定分数, 按照难度级别设置题目对应的分数, 可以平衡每个学生的训练量, 不致于出现太大的差距。

②将实训内容趣味化和生活化, 让学生根据自己的判断自主选择数据结构和算法进行求解, 以充分调动其主观能动性, 彻底转变被动的学习方式, 使其快乐主动学习。

传统的实训内容多是语法描述为主, 缺乏激发学生的求知欲。而ACM的题目大多只是告诉你一个问题场景, 算法则掩藏在问题描述中, 这就使得题目非常具有趣味性和挑战性。 另外, 要解决ACM题目, 要求学生必须具备较好的问题分析和抽象能力, 才能挖掘出隐藏在问题中的算法, 并将算法用具体的编程语言加以实现。 通过这样久而久之的训练, 学生的积极性和主动性比传统的训练有了很大的提高, 可以较好地完成实训环节的教学要求。

③将实训时间分散化, 利用开源OJ代码搭建的在线评测系统, 可供学生随时随地地进行自主学习, 延伸了有限的课内实验时间。

传统排课模式下, 实训课程往往不被重视, 理论课与实训课的比例严重失衡。课余, 学生编写了代码, 却没法验证程序的准确性。 ACM平台为学生提供了实践学习的内容, 学生通过该平台可以在线测试, 最后由系统自带的测评系统自动验证程序的正确性, 并且能够及时反馈运行时间和内存占用情况。学生通过平台可以查看自己的解题数量和排名情况, 也可以查看其他学生的解题情况, 并与其做比较, 判断自行算法的优劣, 以激发学生的求知欲和兴趣。 另外, acm平台还具有在线讨论功能, 做题学生可以针对某个问题或某一算法进行讨论, 在讨论中交流观点, 学到一些不同的解题算法和编程技巧, 还可以锻炼学生的表达能力和沟通能力, 延伸了学生的课内学习时间。

另外, 利用ACM平台, 可供教师进行异地指导, 大大提升教学效率。

2.3 引入ACM-OJ平台和moodle平台, 改革传统的“一锤子”的做法, 践行过程考核。

传统的考核通常“ 期末考试”成绩来衡量, 不能很好地体现学生的真正学习水平, 往往会出现“ 高分低能”的现象。 利用OJ系统和moodle来践行过程考核, 可以更好地检验学生的学习能力, 由于OJ系统具有“ 在线提交, 黑盒测试、实时判题”等特点, 保证了评判的客观性和公正性, 学生也拥有了更多自主性, 可以发挥创造性思维, 针对同一个问题提出多个解题方案, 同时也可以大幅度地降教师检查的工作量, 使教师腾出足够的时间和精力来指导学生编程。 ( 表1)

2.4 注入人文关怀, 注重情感教学

在教学过程中, 教师不仅要有高超的教学技能和人格魅力, 更要有一份爱心。教与学是一个互长的过程, 参与的对象是具有情感的人, 试想, 如果学生不喜欢老师, 即便你真的技艺高超, 也无用武之地, 在这种情况下何谈提升教学效果?鉴于此, 教师要注重情感教学, 正确地处理好师生关系, 营造和谐的教学氛围, 对顺利开展教学和提升教学质量会有无形的保障。

情感教学的方式有很多, 力求“ 和风细雨, 润物细无声”。比如在学生正确回答问题后给以赞美和鼓励, 在学生遇到问题时给予关怀、支持和帮助, 要从学生的角度出发, 真正做好“ 良师益友”的角色, 尽力及学生所想, 解学生所优, 让学生能感受到教师的诚意和关怀, 进而激发学生对该课程的关注度。

3 结论

“ 以学生为主体”的核心, 旨在打破传统“ 灌输式”的教学机理, 建立起“ 以学生为主体, 快乐互助学习”的“ 学堂”, 引入ACM实践教学模式和考核机制, 变被动学习为主动学习, 注入人文关怀, 从而全面锻炼学生的综合能力。

在几年的实践探索中, 本文所提倡的这种教学模式取得了不错的效果, 但是并不意味着过程中没有任何问题, 我们必须与时俱进, 在教学方法和教育模式上不断求是求新, 为进一步提升学生的综合能力而努力。

摘要:结合C语言目前的教学弊端和学情, 以培养学生的逻辑思维能力和创新实践能力为宗旨, 提出一种“以学生为主体, 能力为本位”的教学模式, 提倡快乐学堂, 注重团队协作, 践行过程考核, 渗透人文关怀和情感教学, 大大激发了学生的学习热情和能动性, 提升了教学效果和教学质量。

关键词:主动学习,团队协作,过程考核,ACM模式,情感教学

参考文献

[1]王金娥.基于兴趣和自主的CDIO教学模式研究[J].现代教育科学, 2012 (1) :89-91.

[2]熊芳敏, 许烁娜.C语言课程教学探讨[J].计算机教育, 2010 (13) :104-106.

[3]王秀, 余春艳, 叶东毅.兴趣导向的课程导入模式在高级语言程序设计中的应用[J].计算机教育, 2013 (12) :76-80.

[4]米磊, 贲可荣, 赵皑.“面向学生”的C语言教学方法研究与实践[J].计算机工程与科学, 2014 (31) :5-9.

汇编语言与C语言比较 篇10

关键词:C语言,Fortran语言,混合语言编程,Windows,Linux

随着微型计算机的高速发展和普及,数值模拟或者数值仿真在科研与工程中的应用范围越来越广。物理问题的数值模拟过程必须通过由高级计算机语言(如C,Fortran,C++等等)所编写的计算机程序来实现。Fortran语言因其在数值计算方面具有其特有的优势以及流程简洁,易懂的特点,从而倍受从事数值计算的科研人员的喜爱。在www.netlib.org网站上可以下载到大量成熟的、开放的、以Fortran语言编写的数值计算的源程序。这些程序是从事数值计算的科研人员和工程师的知识宝库。它们可以很容易地向零件装配一样移植到我们自己的程序之中,从而可以节约大量宝贵的时间,避免了不必要的重复劳动。随着计算机技术的不断发展,C、C++等高级计算机语言越来越受到人们的喜爱。尤其当程序中要处理大量的字符串时,这些语言比Fortran语言具有明显的优势。因此,为了兼顾Fortran语言和C语言等的优势,所以现在混合编程得到了越来越多的应用。

Windows操作系统下的混合编程在Compaq Visual Fortran 6.6的帮助文件[1]中有较为详细的介绍。对于初学者来说,仅靠参考该帮助文件而来很好地实现Fortran与C或C++的混合编程还是比较困难的。为此,国内有些学者已经发表了在这方面的研究和体会。肖晓玲等[2]、周振红等[3]以及简建勇等[4]研究了VC与Fortran的混合语言编程。他们详细地描述了VC与Fortran之间的调用约定,命名约定以及参数传递方式。两文中均没有完整的混合语言编程源程序以供参考。黄芝平等[5]研究了VC++6.0与Fortran PowerStation4.0之间的混合语言编程。文中将Fortran语言源程序制作成动态链接库的例子非常具有参考价值,初学者参考后易于实现。在此期间,张向强,陈志英[6]也研究了VC++6.0与Fortran PowerStation 4.0之间的混合语言编程。2006年,章大勇,郑海[7]研究了VC++可执行程序调用Fortran语言编写的可执行程序的混合语言编程方法。该方法并不涉及这两种语言之间的混合程序编写问题。最近,亓雪冬等[8]研究了Linux操作系统下Fortran与C语言的混合编程方法。文中介绍了若干种Fortran与C混合编程的方法。与前面列举的大部分参考文献一样,文中没有给出完整的可直接执行的源程序。

Fortran与VC++或C语言的混合编程应用越来越广泛。随着Linux操作系统被越来越多的人接受以及大规模数值计算的需求,Fortran与VC++或C语言混合编程在Linux操作系统下的应用也越来越多。因为Fortran与VC++和C语言混合编程差别不大,所以这里下面我们仅讨论Fortran与C语言的混合编程问题且仅限于C语言程序调用Fortran语言程序。由于目前有关这类混合语言编程的可以直接运行并且能够清晰地说明混合编程的过程的可参考的源程序比较缺少,因此本文结合所研究的C语言程序在不同操作系统下调用Fortran语言程序的方法的基础上给出了完整的可直接执行的混合语言编程源程序。

1 C与Fortran的混合编程语法

1.1 Windows操作系统下的混合语言编程语法

本文所用的Windows操作系统下的软件环境是在计算机上同时安装了Microsoft Visual C++6.0和Compaq Visual Fortran 6.0(或升级至6.6)。

命名规则:需要注意的是Fortran语言不区分字母的大小写,而C语言中是严格区分字母的大小写的。Fortran语言中的subroutine或function的名字在C语言中声明或调用时是以该名称的全部小写方式实现的。例如,Fortran编写的subroutine Gauss_Integration在C语言中声明时应为extern void gauss_integration();。该例子表明Fortran语言中的subroutine对应C语言中的void函数。Fortran中的函数对应C语言中同类型的函数。不同的是C语言中没有自带复数类型。因此对于Fortran中的复数类型的函数或变量,在C语言中必须自己建立复数结构如下来与Fortran语言中的复数类型匹配。

参数传递:在Fortran语言中所有参数都是以传址的方式传递的。而C语言中默认只有数组是以传址的方式传递的,其它参数都以传值的方式传递。因为C语言对指针操作非常方便,所以我们推荐在C语言调用Fortran语言的subroutine或function时所有的参数都采用传址的方式。这样做的好处是可以减少传递错误的发生。参数传递中特别需要注意的是数组的传递。首先是Fortran中的数组下标默认是从1开始的,而C语言中是从0开始的。其次,Fortran与C语言中的数组在内存中的存储方式是不同的。Fortran中数组是以列为主排列的,而C语言中的数组是以行为主排列的。例如一个二维数组在Fortran语言中该数组在内存中的存储方式为,(11,21,12,22),而在C语言中的存储方式为,(11,21,12,22)。关于这方面的详细描述可以参考文献[3,9]。Fortran中的全局变量传递到C语言中有两种方式。一种方法是利用Fortran语言的common语句,它对应C语言中同名的结构。例如common/examp3/number,对应C语言中的结构extern struct examp3;。另一种方式就是用module的方式。例如,module examp/real rnumber1/end module examp(这里/表示回车换行)对应C语言中的全局变量extern float EXAMP_mp_NUMBER1;。该例子说明两点,一是module方式的全局变量在C语言中除字母mp小写外,其它部分必须大写。二是Fortran中的real类型与C语言中的float相对等,而real*8(或double precision)与C语言中的double类型相对应。

此外,需要补充的是文献[1]中举例说明Fortran中的type类型与C语言中的结构对应。但是遗憾的是作者多次试验都没有成功。至今也没有在文献中或网络上发现有这方面成功的案例。

1.2 Linux操作系统下混合语言编程语法

在Windows操作系统下的Visual Fortran 6.0和VC++6.0编译器中所编写的C语言程序调用Fortran语言程序的混合语言编程程序不能直接在Linux操作系统下运行。针对不同的Linux操作系统混合编程语法也会略有不同。这里以Openuse 10.2,Fedora release 9和Centos release 4.5为例来简要介绍Linux操作系统下C语言程序调用Fortran语言程序的混合语言编程语法。重点是实用性。

首先是Windows操作系统下C语言程序中常用的以下头文件在Linux操作系统下一般是不需要的。

#include;#include;#include

而头文件math.h在两个系统中当用到特定的数学函数时都是需要的

其次,在采用编译器默认选项的情况下Windows操作系统中C语言程序调用的Fortran语言所编写的函数名在Linux操作系统中必须在该函数名后加一下划线。例如,Window操作系统中C语言程序调用的Fortran语言所编写的函数名为gauss_integration,那么该函数在Linux操作系统下的函数名应为gauss_integration_。当C语言程序调用Fortran语言程序时如果所有参数都采用传址方式传递的话,在Linux操作系统下对应函数的参数传递部分与在Windows操作系统下的情形完全相同,不需要做任何修改。

最后,必须注意的是在Linux操作系统下连接C语言程序的目标文件和Fortran语言程序的目标文件时最好使用编译器gfortran。否则的话,将发生Fortran程序中write,read等命令无法识别的错误。

2 C与Fortran混合语言编程实例

Windows操作系统下的源程序

在Windows操作系统下安装编译器Microsoft Visual C++6.0和Compaq Visual Fortran 6.0。然后建立一个win32 console application类型的project,把以上两个源程序文件加入到该project中即可编译运行。运行结果如下:

3 Linux操作系统下的源程序

C语言程序调用的Fortran语言程序c_call_for.f90与上面Windows系统下的文件完全相同,不需要做任何变动。

在Linux操作系统下,作者还没有成功地实现Windows操作系统下已经实现的全局变量传递,例如Windows系统下的number和number1。全局变量在C语言程序和Fortran语言程序间的传递可以间接地通过函数参数传递来实现。即全局变量传递成功与否对C和Fortran语言混合语言编程影响不大。

上面的程序在Openuse 10.2,Fedora release 9和Centos release 4.5三个Linux版本下都成功地运行过。在每个版本下都必须同时安装cc和gfortran编译器。对于本例的编译过程如下,

4 结束语

通过多次数值试验深入探索和研究了Windows操作系统和Linux操作系统下C语言程序调用Fortran语言程序的混合语言编程过程和技巧。文中以完整实例说明了在这两个不同操作系统下实现C与Fortran语言混合语言编程的区别与联系。所编写的完整实例有助于理解和实现混合语言编程,从而提高学习和应用C与Fortran语言混合语言编程的工作效率。该实例具有很好的通用性,只要稍加修改即可被参考者所利用。

参考文献

[1]Programming with Mixed Languages[R].Compaq Visual Fortran Version 6.6 online documentation,2001.

[2]肖晓玲,卢正鼎,张翔.VC与Fortran混合语言编程[J].江汉石油学院学报,2000,22(2):71-74.

[3]周振红,颜国红,吴虹娟.Fortran与VisualC++混合编程研究[J].武汉大学学报,2001,34(2):84-87.

[4]简建勇,曹志宇,燕乔.混合语言编程在有限元法中的应用[J].岩土力学,2003,24(增1):140-142.

[5]黄芝平,戴路,杨波.VC++6.0与PowerStation 4.0混合语言编程[J].微计算机信息2001,17-1:67-68.

[6]张向强,陈志英.Visual C++与Fortran的混编[J].计算机工程,2001,27(1):160-161.

[7]章大勇,郑海.VC++与Fortran混合编程方法研究[J].计算机工程与设计,2006,27(12):2246-2247.

[8]亓雪冬,仝兆岐,何潮观.Linux环境中Fortran与C混合编程研究[J].计算机工程与设计,2008,29(9):2378-2380.

汇编语言与C语言比较 篇11

关键词:c语言;结构调整;培养目标;工程考核

中图分类号:G434 文献标识码:B 文章编号:1673-8454(2012)05-0059-02

一、C语言在程序设计语言中的地位

C语言自从1978年被贝尔实验室正式发布以来.30多年历久弥新。另外从语法角度来说,C++、JAVA、C#均直接继承于C语言语法。因此,C语言作为程序设计语言的基础地位仍然无可替代。

二、C语言教学本质分析

C语言是一种属于机器的语言,所以对人来说,C语言就是一门新的外语。因此学习C语言与学习外语一样,都是易学难精。相比外语学习,C语言学习也是一个持续不断的过程,可以粗略分为三个境界:Itl

1.语法境界

在这个过程中,将主要学习变量定义方法、程序设计的三种基本结构(顺序、选择和循环)、函数定义及调用方法以及良好的编码规范等。对于语法问题。无论是谁,都只能去适应这门语言的规则,所以学生在学习C语言语法时普遍感到枯燥是可以理解的。

2.语义境界

在这个过程中.学习使用C语言完成某个特定的任务,比如“百钱买百鸡”、求素数、求最大公约数、求最小公倍数等经典编程问题。在此阶段主要解决使用C语言解决实际问题的能力。

对于这些C语言应用,学生普遍认为这些算法问题具有挑战性。这些题目经常成为C语言的考试内容,也是被很多学生认为能够从本门课程中学到的有用知识。

3.认知境界

在这个过程中,学习语言背后的计算机硬件、操作系统原理,学习与语言无关的算法设计(包括数据结构知识),学习软件工程知识(比如分层体系结构等)等。在此主要解决如何按照工程要求(比如正确性、可靠性、可维护性、性能等)解决实际问题的能力。

对于这些知识,学生在结课时认识仍然是模糊的。当然,这也不可能仅仅通过C语言一门课程就能够让学生达到改变认知的地步,但这是四年信息管理与信息系统专业本科学习的目标之一。

三、C语言教学实践改革

因为课堂教学在本质上是不可分割的一个整体,例如在讲授“百钱买百鸡”例子时完全可以同时涉及语法、算法和认知这三种境界。基于C语言教学本质的分析,根据信息管理与信息系统专业培养目标,结合学生实际具有的基础知识和基本技能,将C语言在教学实践中从结构方面进行如下调整:

1.淡化住运算讲授

作为计算机专业学生,应该掌握位运算。因为位运算不仅是一种基本运算,而且往往可以为工程提供一种高性能解决方案。但是作为信息管理与信息系统专业的学生.一方面位运算与计算机硬件高度相关,另一方面完全可以用其他方法来代替位运算解决方案,只是损失些性能而已。

2.弱化输入输出函数语法教学

虽然C语言的scanf和printf函数功能强大,但是能够正确运用却不是一件容易的事情,因为这里面涉及数据类型、数组、指针等众多内容。在输入输出基本通过GUI界面、数据存储大多经由DBMS的今天.熟练掌握scanf和printf函数已经不再是一种必需。

3.补充适当硬件知识

C语言提供的丰富数据类型让初学者有时难以理解:有必要如此区分整数和小数吗?不都是可以做四则运算吗?在不同数据类型统一运算时,因为自动类型转换得到的异常结果经常让初学者困惑不已。这个问题在编程语言层次上很难解释清楚,但是从硬件层次上却容易说明,因为其背后的硬件机理不同。

4.示范良好编码规范

在教学和上机实践中,始终贯穿并示范良好的编码规范。比如无论在循环中还是在分支中,坚持为程序块加上完整的块标志。在运算符的优先级讲述中,强调小括号可以改变并明晰计算的优先级,如此讲授不仅可以减少语法的讲授时间,同时也可以提高程序设计质量。在教学中有意识地示范如何在关键位置处加上调试输出语句.部分代替单步跟踪,提高程序调试效率。

5.强化程序设计方法教学

函数作为一个基础的程序设计工具,在实践中的地位非常重要,是软件工程、各种软件设计方法的实现基础。另外.在函数层次编程,可以锻炼一个人的问题抽象能力和模块划分意识。在教学中,有意识强化函数应用,比如要求以函数方式对问题进行设计,并且在上机实验中安排大作业,要求两个人协作完成,从而培养学生模块化问题解决意识和编程习惯。

6.侧重符合机器思维的算法讲授

在讲授如何求解最大公约数例子时,虽然辗转相除法效率很高,但是穷举法更容易理解和实现,而且也更加符合算法设计思维。辗转相除法对于专业软件来说意味着效率,但是对于初学者来说则意味着很高的门槛。对于常见的“数组越界”问题,采用的对策是让学生适应计算机从0开始的编址方案,尽管在初期学习中可能带来一些困难,但是如此坚持可以保证学生对计算机原理的理解上具有完整性和一致性。这样,采用一套理论就可以很好解决指针与多维数组的地址计算关系。

7.调整指针教学侧重点

为方便与后续课程的衔接(包括数据结构、数据库原理)。重点讲授与一维、二维数组、结构体、链表相关的指针应用。而对于其他的指针应用(如函数指针、双重指针等),则概括性提及,让学生了解C语言指针的强大和灵活,从而更全面理解C语言指针的本质,以及由此带来的程序调试挑战。

四、C语言教学考核

在课程考核中,参照工程要求,抛弃以往的那种单纯考核语法的题目(尤其是那些不常用的语法),代之以符合良好工程编程规范的程序阅读题和程序设计题,分别通过笔试和机试进行。经过两年实践,发现此种考核方法更有利于反映出学生的真实水平,但是由此产生的问题是经常无法满足对考核成绩的正态分布要求,呈明显的阶梯状分布。

C语言指针的研究与运用 篇12

关键词:C语言,指针,数组,函数

指针是C语言中的精髓,它在C语言中被广泛的使用。理解和运用好指针可以灵活方便地处理程序中各种复杂问题,可以轻松完成其他高级程序设计语言不便完成的任务。

一、指针的概念

一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。

指针的引入为系统存取数据提供了一种“间接访问”方式。所谓间接访问,是先访问存放变量地址的存储单元,得到该变量的地址,再对变量内容进行访问。

指针变量是一种特殊变量。系统为指针变量分配一块连续存储单元不是供其存储数据,而是存储内存地址。因此,指针变量是存储内存地址的变量。

二、指针的类型

1、指向简单变量的指针。指针所知的数据类可以使简单的数据类型。

例:(1)int*p,i;p=&i;意思是指针变量指向整型变量i

(2)char*p,a;p=&a;意思是指针变量指向字符型变量a

(3)int*p,a[10];p=a;意思是指针变量指向数组a

2、指向数组的指针。指针所指的数组既可以是一维数组,也可以是多维数组。

分析:指针P指向了a数组的首地址,通过p++来访问a数组的每一元素。

3、指针数组。数组元素是由指针变量组成的一种指针。定义如:nt*p[2];指针数组p包含两个元素,每个元素指向一个整型数据。

分析:指针P是一个数组,通过for循环语句给指针数组中的每个指针变量赋值,p[1]的初值为数组a的第二行的首地址,*(p[1]+1)便是元素a[1][1],因此程序输出7。

4、指向指针的指针。指针变量指向的是指针的地址,定义如:int**p。

分析:指针数组p的各个指针变量指向数组a的各行首地址,q指向指针数组p的首地址,*(q+1)等同p[1],如此,*(*(q+1)+1)便等同*(p[1]+1)也就是a[1][1],因此程序输出7。

5、指向函数的指针。指针变量指向函数的首地址,然后通过该指针变量调用该函数。定义如:int(*p)()。

分析:int (*p)()表示定义了一个指向函数的指针变量,函数名max代表了函数的入口地址,执行p=max后,p指向了函数max,(*p)(a,b)便是通过p调用函数max。

6、指向文件的指针。C语言对文件的操作并不是直接通过文件名进行的,而是根据文件名生成一个文件指针,通过该指针来对文件进行操作.定义如:FILE*fP(fp为文件指针,此时fp不指向任何文件)。

三、指针应用中常见的错误

1、把数据赋给指针变量。指针在使用前必须进行初始化,赋予指针的值必须是地址。

正确语句:p=&i;“&”是一个取变量地址的运算符。

2、指针常量运算错误。程序中常量指针是不能被修改的。典型有数组名指针常量和指向字符串常量的指针。

3、指针赋值类型不一致

正确语句:p=a[0];或p=&a[0][0];如果一定把a赋值给p,必须先将a转换成整型指针类型,如:p=(int*)a;。特别是将多维数组赋值给指针变量时应注意类型匹配。

参考文献

[1]陈建辉,C语言指针探讨[M]·莆田高等专科学校学报,2001

[2]施冬梅,C语言指针教学中应注意的几个方面[M].镇江高专学报,2004

上一篇:现代住宅建筑设计论文下一篇:生与死