c语言

2024-07-01

c语言(精选十篇)

c语言 篇1

1 ATPCS调用标准

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

1.1 寄存器使用规则

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

1.2 堆栈的使用规则

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

1.3 参数传递规则

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

2 ATPCS应用

2.1 汇编语言调用C语言

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

2.2 C语言调用汇编语言

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

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

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

3 内嵌汇编

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

4 结束语

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

摘要:在计算机系统嵌入式应用程序的开发中, 对于汇编语言与C/C++语言的设计开发, 二者都存在着优缺点, 所以相关人员在开发中会采用ARM汇编语言与C/C++语言混合编程, 从而取得最大的效果。本文主要研究了ARM汇编语言与C/C++语言混合编程的设计实现方法, 并进行相关的讨论。

关键词:ARM汇编语言,C/C++语言,混合编程

参考文献

[1]马忠梅, 徐英慧.ARM嵌入式处理器结构与应用基础[M].北京航空航天大学出版社, 2010, 1 (2) :20-30.

[2]史斌, 孙晔.ARM汇编语言与C/C++混合编程方法[J].电子测量技术, 2010, 6 (6) :15-20.

c语言 篇2

课题:

教学目的: 教学重点: 教学难点: 第一章 C语言概述

1、了解C语言出现的背景

2、掌握C语言程序的构成、书写格式和上机步骤 C语言程序的构成 上机操作

步骤一 引入新课

从计算机应用基础中学过的计算机语言及语言处理系统引出C语言。步骤二 讲授新课

一、C语言出现的背景

1.ALGOL60 :1960年面向问题、结构化,可读性、可移植性好,不能对硬件操作; 2.CPL:63年接近硬件,规模较大、难以应用;

3.SIMULA:1966~1967 SIMULA 66是ALGOL 60的扩充;SIMULA 67引进了“对象”和“类”等概念而成为第一个面向对象的语言;

4.BCPL :67年由CPL改制,结构化、直接处理硬件;

5.B语言:1970年贝尔实验室的Ken Thompson以BCPL语言为基础设计的,开发了第一个UNIX操作系统;

6.C语言:1972-73年间,保持了BCPL和B语言的精炼与接近硬件的优点,克服了它们过于简单、数据无类型的缺点,重写了UNIX操作系统的90%;

7.标准 C:以1978年发表的UNIX第七版中的C编译程序为基础,Brain W.Kernighan&Dennis M.Ritchie合著的《The C Programming Language》问世; 8.ANSI C:1983年美国国家标准化协会(ANSI)制定的标准

9.C++:1986年 与C兼容,保持了C的所有优点并进行了增强:增强了面向对象的机制,成为典型的面向对象和面向过程的混合语言,适用于大型系统软件和应用软件的开发;

10.87 ANSI C:1987年制定的新标准;

11.ISO C:1990年ISO接受87 ANSI C为ISO C的标准,该标准是目前C编译器的标准。

二、C语言的特点

1.语言简洁、紧凑,使用方便、灵活; 2.运算符丰富

3.数据类型多(整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类等)4.具有结构化的控制语句 5.语法不太严格,自由度大

6.既是高级语言,又具有低级语言的功能 7.生成目标代码质量高,程序执行效率 8.可移植性好

三、C语言程序的构成

1.C语言是由函数构成的,至少有一个main()函数;

2.每个函数由函数首部和函数体组成;函数体由说明语句、执行语句组成; 3.每个C程序从main()函数开始执行,并在main()中结束; 4.每个语句和数据定义的最后必须加分号;

5.C程序无输入、输出语句

输入功能由scanf()函数完成;输出功能由printf()函数完成; 6.可加注释/*……*/

借助程序实例加以说明,并提倡良好的程序设计书写风格: 1)每个语句占一行;

2)同一层次的语句从同一位置处开始书写;

3)同一层次中嵌套的结构,应从不同位置开始书写;

4)编译控制行、外部数据定义、函数定义之间空一行书写; 5)对于函数体的大括号的书写约定 6)学会使用注释。

四、上机步骤

1.进入环境c:tctc 或进入ms-dos,>cd,>cd tc,>tc 2.编辑源程序 3.保存源程序 4.编译源程序F9 5.执行程序Ctrl-F9,查看结果Alt-F5 6.退出C环境Alt-X

步骤三 课堂小结

1、C语言的构成要素,main函数在程序中的作用

2、上机操作的过程

步骤四 布置作业 上机练习:

1、进入C编辑环境,按良好的程序设计风格输入例题,按步骤编译、运行、查看结果

c语言 篇3

【关键词】C语言;编程技巧;学习技巧;教学效果

前言:我国高校已经普遍开展C语言的学习,对培养知识经济时代下高素质、复合型人才起到了重要的推动作用。然而在实践过程中却发现,学生学习C语言的动力不足、掌握及运用能力较低,为C语言进一步发展蒙上了一层阴影。所以本文首先对C语言学习过程中的难点进行分析,随后探讨C语言编程技巧的应用内容,以为学生学习及课堂教学效果的提升提供帮助。

一、当前C语言学习难点

(一)函数的定义和应用

由于C语言是一门较为高级的计算机汇编语言,在学习过程中包含了大量的函数,而相应函数如何定义和使用成为当前学生学习的难点之所在。众所周知,C语言编程过程中往往会通过汇编语言来将函数功能在相应代码中实现[1]。然而,在实际运用及学习过程中经常会出现函数嵌套的事情发生,而产生该现象的原因则是在C语言编程过程中已經定义了一个函数,但是操作者并没有注意到此种情况,当使用不同定义的函数时,系统就会提示不能在函数体内定义函数。所以在C语言学习过程中关于函数的定于和使用是困扰学生的主要问题。

(二)编写程序的工整严谨性

运用C语言编写程序是当前知识经济时代下较为常用的程序编写方式,需要操作人员具有较强的逻辑思维能力以及编写水平,并且耐心要足够良好。编写程序主要是通过计算机检验来实现相应的功能,在编写过程中每一个细节问题都需要处理到位。一旦某个环节某个字母没有正确书写,那么将会导致编写的整段程序无法运行,降低了程序编写效率。而编程工整性和严谨性是考验每一个学生学习效果及能力的重要指标。但是对于当前大多数学生来说,编写程序仍然是一个难点问题,出错几率始终居高不下,导致学生在经过了很长时间学习后依然无法掌握正确的编写技巧,继而丧失了继续学习的兴趣和信心。所以C语言学习过程如何运用编程技巧来提高编写程序的工整严谨性成为当前亟待解决的问题。

二、C语言编程技巧在C语言学习中的应用

(一)指针技巧的掌握与运用

C语言编程技巧中指针是一个较为特殊的变量,在其中存储着大量的数值,可以被称作是内存地址之一。指针技巧可以通过分解来将各部分内容展现在学生面前,以促使学生明确指针的使用。当前C语言学习中指针由指针类型、指针指向类型、指针值、指针自身所占内存区所组成。指针类型是C语言学习及编程中最为常见的知识点,学生可以通过去除指针声明语句中所包含的指针名字来判断该指针类型,如:int*ptr、char*ptr,将指针名字ptr去掉后剩下的int*、char*即为指针类型。学生通过该技巧的使用可以在短时间内明确所有C语言指针的类型,为其应用提供了便利条件。指针指向类型相较于指针类型稍稍复杂一些,上例中去掉*后剩下的int、char等即为指针指向类型。所以指针技巧的掌握与运用主要在于学习者的耐心及细心程度,加强其主观重视程度后,学习C语言将会更加得心应手。

(二)C语言特有函数技巧的掌握于应用

C语言编程中函数的应用是实现特定功能的基础与前提,学生往往在函数的定义及使用过程中出现不同程度的问题,造成其学习效果不佳。因此,在C语言课堂教学中教师可以在函数定义所包含的名字、参数名称、类型以及函数返回值类型逐步分解并一一明确其各组成部分的功能,并且将独立的函数存储在编译系统数据库中,使用时输入#include指令即可将想要使用的头文件放入本文件中,使得C语言特有函数能够在短时间内被学生掌握及利用[2]。随着计算机技术快速发展,C语言特有函数的编写已经可以通过程序化步骤来实现,在方便了使用的同时,也降低了学生学习难度,使得C语言教学效果得到大幅提升。

(三)算法技巧的掌握与应用

算法是程序编写工作的重要组成部分,也是学习过程中花费时间较长的环节。为了能够提高学生学习效率,教师需要在课堂教学中将常用流程符号普及给学生,并且利用流程图来讲算法的应用逐一分解,向学生直观展示算法的应用。当前还可以利用自然语言来表示算法,同时与流程图讲解相结合,使得具备一定数学知识的学习者能够熟练掌握算法技巧,并运用在具体的程序编写工作中。C语言是建立在数学思想基础上的应用学科,数学思维在算法技巧掌握及应用中起到了重要的辅助所用。所以,在通过系统展示及分步讲解基础上拓展数学思维去寻找C语言程序编写规律,可以为其血气起到事半功倍的效果。

(四)位运算技巧的熟练掌握与应用

C语言之所以独立于其他计算机语言,就在于位运算使用。位运算是一种以二进制为对象、进行各种程序、数据、结果运算的一种基本算法。特别是在计算机文件中其应用更为频繁,掌握了位运算技巧,就相当于掌握了打开宝藏大门的钥匙。比如:数独时需要使用大量Hash表来统计九宫格里已经存在那些数据,如果在一个九宫格之中已经存在数字2和5,那么采用位运算后该九宫格可以使用数字18来表示;如果某一行或某一个九宫格为运算状态为511,则代表了该九宫格空间已满。要想改变其状态,只需要对其进行位操作,而省去了将数据重新转换成为二进制修改之后在转回来的步骤,使得整个C语言学习效率得到大幅提升[3]。

结论:综上所述,本文通过对当前C语言学习难点的分析得出了困扰学生的主要问题在于函数的定义及使用和编写程序的工整严谨性。并以此为依据提出了C语言编程技巧中指针、特有函数、算法、位运算等技巧熟练掌握是提高C语言学习效率的关键。希望通过本文的分析能够为我国高校改进C语言教学提供帮助,以促使C语言知识正迁移。

参考文献:

[1]段煅.C语言编程技巧在C语言学习中的应用[J].电脑编程技巧与维护,2010,12(20):150-151.

[2]余勍,王捷.浅谈C语言编程技巧在C语言学习中的应用[J].信息通信,2013,25(07):108.

c语言 篇4

1 C语言

1.1 C语言特点

C语言在计算机语言编程中应用最流行、最广泛, 在学习中应对C语言有一点了解, 在使用过程中, C语言具有以下的特点: (1) C语言比较紧凑、操作灵活、操作方便, 没有非常严格的语法限制, 比较自由的书写程序过程, C语言有效结合了低级语言的实用性及高级语言的结构性, 功能非常强大。 (2) C语言应用范围广泛。C语言是学习其他语言程序的基础, 可植性比较强, 在多种操作系统中, 皆适用C语言, 可以灵活使用运算符, 实现编程的高效性。 (3) C语言的语法中数据结构多种多样, 简单复杂皆有, 图形处理能力甚强。 (4) C语言可以使用数据和代码分割, 具有结构式的语言特点, 程序层次清晰, 便于维护、使用及调式进行。C语言能够对物理地址进行直接访问以及各种操作。因此, C语言是学生学习计算机课程并不可少的一门知识, 但要学好C语言, 盲目的学习是不对的。

1.2 C语言的产生背景

1970年美国的Ken Thompson, 以BCPL语言作为基础, 然后设计出简单且接近硬件的B语言, 但是B语言功能比较有限, 过于简单。1972年~1973年, 美国D·M在B语言基础之上设计出C语言, C语言的出现给程序的编写带来不少便利, 而且编写程序比较自由, 吸引许多软件使用它。C语言语法里的运算和程序非常丰富, 编写程序的运算方法很多, 拥有可以实现一些高级程序都无法实现的功能, 且C语言用起来比较灵活, 在运算各种数据结构时, 不管事简单还是复杂, 都可以简单实现。C语言不仅在运算和程序编写上更加便利, 且可以直接访问地址, 并进行操作, 较快较容易的对程序进行编译以及控制。

2 学习

虽然许多学生选择计算机专业, 努力学习C语言, 但是学生仍然很难对C语言产生兴趣。C语言是计算机专业学习的基础课程, 且功能强大, 用途广泛。随着经济迅速发展, 第三产业越发越重要, 计算机相关的产业所占比重越来越大, C语言功能强大, 在计算机中越来越受到重视。

针对C语言的学习, 仅仅是课堂的理论传授远远不够, C语言理论比较丰富, 集合众多语言特点, 通过直接的感官方式教授给学生, 学生难以完全理解。如果教师能够把内容通过直观的方式展示出来, 比如让学生上机操作, 让理论与实践相结合, 提高学生对C语言的学习兴趣。

C语言中包含比较复杂的结构和算法, 许多学生难以理解, 只能简单的记忆, 但是学习效果比较低, 且学生觉得枯燥, 没有较高的学习兴趣, 在学生学习理论的同时, 应该多上机操作, 更加容易的掌握C语言的规律和方法。教师要注意自己的教学方法, 不能简单的进行实践教学与理论教学, 要关注学生, 加强学生与教师的沟通, 帮助学生理解课堂课外的C语言相关知识, 在教授知识之外, 教师要突出C语言在计算机学习中的重要性, 让学生更容易、深入的理解及分析C语言, 增加学习兴趣。

3 C语言编程的技巧

学生觉得C语言抽象、难以理解, 归根结底是没有找到学习的技巧, 对于刚入门者说, 学习C语言比较吃力, 学习任何一项技能都需要一个过程, 关键在于掌握其精髓, 掌握其中精髓再学习这门课程就容易许多。对于C语言, 编程技巧非常重要。 (1) 指针的掌握。掌握指针是C语言中比较重要的技巧, 指针虽有消耗内存的缺点, 但指针在运算中速度加快, 编程语句也更加容易, 指针的耗内存虽大, 但对整个编程而言却是微不足道。学生在学习指针这一章节时, 需加强学习能力, 除学习课堂知识之外, 可以多在网上查询资料, 进行补充, 掌握好指针这一技巧。 (2) 掌握数学知识。在学习计算机过程中, 数学知识的重要性不容小觑, 能够解决C语言运算中的许多问题, IT界有一句话叫“数学是计算机之母”, 可见数学对计算机的重要性。在C语言学习中, 逻辑思维较好的同学可以较容易的学习C语言, 进行编程前会分析, 选择更加简单的运算方法, 因此, 数学知识对学习C语言起很大作用。 (3) 掌握位运算。位运算的使用可以方便简洁代码, 提高运算效率, 较快解决问题。在计算机程序中, 位是最小数据单位, 是所有操作和运算的基础单位, 位运算是所有操作的基础运算程序。当然具体问题需要具体分析, 提高学生兴趣和编程效率, 让C语言的应用更加广泛最为重要。

4 结语

在学习C语言的过程中, 学生应准确了解C语言的特点, 学习并掌握C语言的编程技巧, 提高学生的学习兴趣, 学习更加具有目的性, 提高C语言的学习效率以及学习质量。培养学生的编程能力, 能够更好的服务社会。

摘要:随着时代的发展, 信息技术发展迅速, 计算机人才被社会所大量需求。因此大学中大都设立计算机专业, 为社会培养所需人才, C语言是计算机专业的重要课程之一, 是大一课程学习中比较基础的一门课程, C语言功能强大, 对于学生以后专业基础起到很大的作用, 但是学生学习效果并不是很好, 即使努力学习也没有得到预期的效果。笔者对C语言编程技巧在C语言学习进行研究, 并且提出解决措施。

关键词:C语言,学习编程,语言特点

参考文献

c语言 篇5

7.1.1二维数组的定义

前面介绍的数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的,因此C语言允许构造多维数组。多维数组元素有多个下标,以标识它在数组中的位置,所以也称为多下标变量。本小节只介绍二维数组,多维数组可由二维数组类推而得到。

二维数组定义的一般形式是:类型说明符 数组名[常量表达式1][常量表达式2]

其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。例如:

int a[3][4];说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共有3×4个,即:

a[0][0],a[0][1],a[0][2],a[0][3]

a[1][0],a[1][1],a[1][2],a[1][3]

a[2][0],a[2][1],a[2][2],a[2][3] 二维数组在概念上是二维的,即是说其下标在两个方向上变化,下标变量在数组中的位置也处于一个平面之中,而不是象一维数组只是一个向量。但是,实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。如何在一维存储器中存放二维数组,可有两种方式:一种是按行排列,即放完一行之后顺次放入第二行。另一种是按列排列,即放完一列之后再顺次放入第二列。

在C语言中,二维数组是按行排列的。即,先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四个元素也是依次存放。由于数组a说明为int类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节)。

7.1.2二维数组元素的引用

二维数组的元素也称为双下标变量,其表示的形式为:

数组名[下标][下标] 其中下标应为整型常量或整型表达式。例如:

a[3][4] 表示a数组三行四列的元素。

下标变量和数组说明在形式中有些相似,但这两者具有完全不同的含义。数组说明的方括号中给出的是某一维的长度,即可取下标的最大值;而数组元素中的下标是该元素在数组中的位置标识。前者只能是常量,后者可以是常量,变量或表达式。

【例7.6】一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。

可设一个二维数组a[5][3]存放五个人三门课的成绩。再设一个一维数组v[3]存放所求得各分科平均成绩,设变量average 为全组各科总平均成绩。编程如下:

main(){

int i,j,s=0,average,v[3],a[5][3];

printf(“input scoren”);

for(i=0;i<3;i++){

for(j=0;j<5;j++)

{ scanf(“%d”,&a[j][i]);

s=s+a[j][i];}

v[i]=s/5;

s=0;

}

average =(v[0]+v[1]+v[2])/3;

printf(“math:%dnc languag:%dndbase:%dn”,v[0],v[1],v[2]);

printf(“total:%dn”, average);}

程序中首先用了一个双重循环。在内循环中依次读入某一门课程的各个学生的成绩,并把这些成绩累加起来,退出内循环后再把该累加成绩除以5送入v[i]之中,这就是该门课程的平均成绩。外循环共循环三次,分别求出三门课各自的平均成绩并存放在v数组之中。退出外循环之后,把v[0],v[1],v[2]相加除以3即得到各科总平均成绩。最后按题意输出各个成绩。

7.1.3二维数组的初始化

二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。例如对数组a[5][3]:

按行分段赋值可写为:

int a[5][3]={ {80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85} };按行连续赋值可写为:

int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};

这两种赋初值的结果是完全相同的。

【例7.7】

main(){

int i,j,s=0, average,v[3];

int a[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};

for(i=0;i<3;i++)

{ for(j=0;j<5;j++)

s=s+a[j][i];

v[i]=s/5;

s=0;

} average=(v[0]+v[1]+v[2])/3;

printf(“math:%dnc languag:%dndFoxpro:%dn”,v[0],v[1],v[2]);

printf(“total:%dn”, average);

}

对于二维数组初始化赋值还有以下说明:

可以只对部分元素赋初值,未赋初值的元素自动取0值。

例如:

int a[3][3]={{1},{2},{3}};是对每一行的第一列元素赋值,未赋值的元素取0值。赋值后各元素的值为:0 0

0 0

0 0

int a [3][3]={{0,1},{0,0,2},{3}};赋值后的元素值为:

0 1 0

0 0 2

0 0 如对全部元素赋初值,则第一维的长度可以不给出。

例如:

int a[3][3]={1,2,3,4,5,6,7,8,9};可以写为:

int a[][3]={1,2,3,4,5,6,7,8,9};

数组是一种构造类型的数据。二维数组可以看作是由一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组,就组成了二维数组。当然,前提是各元素类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组。C语言允许这种分解。

如二维数组a[3][4],可分解为三个一维数组,其数组名分别为:

高职院校C语言教学探讨 篇6

关键词:C语言;教学改革;教学方法

一、引 言

《C语言程序设计》是计算机专业的必修课和其他理工科学生的重要基础课程,由于覆盖面广、应用广泛,对于学生的基本编程素质的培养有较大的影响而备受重视。如何更好地完成教学目标,让学生真正掌握C语言,深入了解其精髓,值得每个C语言教学工作者不断探索。

当前,在高职高专院校,《C语言程序设计》课程一般都设置在一年级,学生从高中的基础教育转向学习全新的编程性的语言,学习难度比较大。主要有以下几个原因:一是学生的英文底子普遍薄弱,而C语言英文运行环境,对于运行过程和提示错误根本看不懂,导致上机调试困难重重;再加上对程序主观上认识过难,无形中挫伤了学习的积极性。二是学生的数学基础也比较差,一些编程算法都需要数学思想来支撑。诸多原因造成了C语言教学效果不佳,而对其掌握的程度如何,直接影响到后继相关课程的学习和掌握,甚至是整个专业的后继发展。

笔者根据多年的程序设计课程的教学实践,对《C语言程序设计》课程从教学内容、教学手段、教学方法等方面行了一些改革,并取得较好的教学效果。

二、教学改革措施

1.精简内容,培养兴趣

C语言语法繁多,学生初步接触容易有惧难情绪,因此第一堂课的教学显得尤为重要,它是能否激起学生学习热情的关键因素。一般建议在第一堂课介绍一些应用C语言的小项目,比如嵌入式开发驱动程序的编写、学生注册信息系统的管理。向学生演示运行一些信息管理系统及遥控电风扇运转的一些代码,让学生了解这门语言的一些基本功能,激发他们的学习兴趣。同时用每年获得大赛的学生的事迹激励他们,讲讲学好这门课的方式方法,帮助他们树立学好这门课的信心。

2.案例引导,项目驱动

以谭浩强主编的教材《C程序设计为例》为例,教学内容主要包括C语言语法基础、程序控制结构、数据类型、数组、指针、函数、文件以及它们的应用等。教材在内容组织上,虽然依逻辑思维方式进行了归类,但难点还是较为集中,跨度大;概念讲得多,分析少。再加上高职高专院校的学生,有相当一部分入校时,分数低,数学基础较差,逻辑思维能力不是很强,如果按照书本章节一步步讲下来,学生会产生畏难情绪,学习兴趣开始降低,以往一些学生在第三章节数据类型及表达式还没有完全上完心底就已经开始放弃这门课了。所以在上这门课的时候,建议采用“案例引导、项目驱动”[1],把课程学习内容联系真实环境,提出各种问题并形成主题任务,进行任务驱动式教学;将学生置于发现问题、提出问题、思考问题、探究问提、解决问题的动态过程中学习。比如第二次授课,就可以提出做一个管理信息系统,先和学生进行基本的功能分析,然后逐步地以实现每一个功能将各个章节的知识点融入进去讲解,以任务驱动教学[2],让学生真正了解语法为编程服务,而不是单纯的死记硬背一些语法知识。

3.建立良好的网络资源平台,促进师生互动

教学中涉及到的很多知识较抽象和难于理解,因此需要学生课下对课程的重点难点进行进一步消化和理解。因此,应该采用行之有效的办法来帮助学生解决在自主学习中可能遇到的一些问题,比如学生需要进行自主学习的一些教学资源,需要一个进行问题探讨交流的空间,以及教师需要及时地掌握学生自主学习的情况等等。为此,需要建立关于这门课程的学习网站,分别设置课程学习模块、在线练习及在线测试、学习资源建设、参考文献资料、教学论坛等。笔者在完成一个院级项目的过程中建立了一个关于C语言的重点课程建设网站:重难点动画演示课程中涉及的比较难理解的算法以及知识;常见问题解答以章为单位,由课程老师共同建设,不断的加以充实,逐年积累;利用留言板功能建立课程的论坛,教师可以根据自己的教学内容在其中创建话题(发帖),学生也可以在上面对自己的疑问发帖,针对这些话题学生被允许在课题后面发表自己的看法并与教师或其他同学交流,这一功能消除了传统教学中教师只能当面答疑的时空限制,学生能在讨论板上提出自己的问题,而教师可以对具有代表性的问题做出统一解答,避免重复解答,从而提高了教学效率及学习的主动性,同时教师可通过总结学生提出的问题对教学内容做出适时调整。

4.重视上机实践,注重综合考核。

C语言是一门实践性很强的学科,除课堂上的理论讲解外,实验教学也是至关重要的。由于学生是第一次接触程序设计,许多概念都是很抽象的,因此,要求在课程内容的安排上循序渐进,由浅入深,逐步引导。实践课除了需要携带教材以外,另外还需要与之相配套的实验指导书和实验报告册,对于实验指导书可以选择与课本相配套的,教师也可以根据自己的教学需要和学生的实际情况编写合适的实验指导书。对于这门课程学习结果如何,不是一张试卷就能给出答复。我们追求的不是学生懂了多少语法,而是能做出什么,所以对于这门课程,对学生学习成绩的评定,建议采用综合考核法,将平时的实践成绩与期末卷面成绩进行综合,得出本课程综合考评分。这样才能更加客观地反映学生的学习情况,同时也能更好地促进学生平时的学习。

三、结 语

C语言的教学需要不断探讨,我们应在教学过程中不断模索,化繁为简,多钻研教材教法,使学生将所学知识转化为实际工作的能力,提高学生的实际工作水平、综合素质和就业竞争能力,为企业提供适用型的人才。

参考文献:

[1] 邓云洲.案例教学在教学基本要素上与传统教学的区别.教育发展研究,2001,(12).

浅析C语言指针 篇7

指针是C语言的一个最重要的特征, 它提供了一种统一的方法, 使其能访问远程的数据结构。但对C语言初学者而言, 在编程过程中熟练的使用指针并不能像使用int型变量一样地轻松愉快, 容易上手, 往往是不得其精髓。我们知道, 不论什么时候, 运行一个程序A, 首先都是操作系统自身的加载器把A装入内存, 然后CPU才能执行。所以A程序的所有要素都会驻留在内存的某个位置。

下面我们看一段示例程序。

首先, 编译器会为变量i和j开辟内存空间, 用来存储i和j的值。同时也会为函数cmp开辟空间来存放其代码。这样使得最终的可执行程序就变为了跟内存一一对应的序列。操作系统的加载器把这个可执行程序载入内存后, cpu就可以按一条条的语句顺序执行了。

既然内存空间同程序的所有要素是一一对应的, 那么怎么区分各要素的存放位置呢?内存使用不同的地址存放不同的要素, 如下所示。

由于变量都存放于内存地址空间, 并且与地址之间是一一对应的, 那么利用地址能做些什么呢?我们可以把地址存放到别的变量中, 以便我们可以在以后程序的某个地方使用它。C语言有一个专门用来存储内存地址的变量, 这就是指针变量, 通常我们称之为指针 (pointer) 。它是一种变量类型, 这种变量方便我们把需要操控的内存地址记忆起来。

定义指针

定义指针的运算符同乘法运算符是一样的, 都用“*”表示。定义一个指针变量在语法上是简单的, 同我们定义其他变量的区别是:首先规定它指向的变量类型, 然后并不是立即就给出其变量的标识符, 而是在变量类型同变量标识符之间插入指针运算符 (星号) , 这样就告诉编译器这是一个指针变量。

C语言中指针可以指向任何的数据类型, 包括函数。函数指针的定义是:函数返回值+ (* + 函数指针变量标识符) + (函数的参数列表) 。函数指针能构建出更加清晰的程序结构。编程中经常使用的指针定义就是这两种, 当然有些定义可能只是语法上面有意义, 但是语义上面不一定有具体的意义。例如, int* (* (* (*f) () ) []) () 声明f是一个函数指针, 该函数返回一个指针, 该指针指向数组, 该数组元素是指针, 那些指针指向返回值类型为整型指针的函数。这样的声明可能永远也不能应用到实际的代码中。

指针和数组

数组是内存中一段连续相同类型的内存数据, 这组数据的首地址以数组名字来标识。所有数组对其数据的操控都可以使用指针来实现, 同理, 指针指向一段内存数据时, 也可以使用数组下标的方式来实现操作。

数组与指针在使用上的某些地方是非常相似的, 但是数组与指针又有一些细小的区别。数组名表现为一个静态指针, 也可以直接把它赋值给指针变量, 但它的大小与指针通常是不同的。数组名的内涵在于其指代的实体是一种数据结构, 这种数据结构就是数组。数组名可以作为参数传入一个接受参数为指针的函数内部, 但是此时数组完全丢失了数组的本义, 变成了完全的指针类型, 其常量特性 (可以作自增、自减等操作) 可以被修改。并且, 数组名不能再重新赋值为其他的数组名字, 而指针变量是可以被重新赋值并指向一段新的内存地址的。

指针的运算

指针的运算指的是指针的--、++、-和+运算, 一个指针可以加上或者减去一个整数。两个指针相减得到的是指针之间相隔的元素个数。不同的指针变量之间进行相加运算尽管在语法上是合理的, 但是从语义上来讲是没有意义的。除了void型指针和函数指针以外, 所有其他类型的指针都可以进行指针运算。通过指针变量的增加或减少, 指针变量会指向新的内存地址。

一般来说, 指针变量自身的大小在理论上是指机器的字长, 但是指针变量的运算并不是按照指针变量自身的大小进行内存偏移的, 而是按照指针变量指向的变量类型大小进行内存偏移的。比如, 声明一个整形的指针p, 假定p的地址是0x4323672, 那么++p后p的值变为0x43236726。偏移的内存大小等于整形变量的内存大小4 (sizeof (int) ) 。同理, double型指针进行++运算后偏移值就是8 (sizeof (double) ) 。

指针强转

如同整形变量可以强转为浮点型变量一样, 指针类型也可以通过强转变成新的指针类型, 比如我们可以把整形指针强转为字符型指针。指针强转最诱人的地方就在于对内存数据进行操控就够了。指针强转使得指针对数据的操控更具有针对性, 而且通过指针的默认强转可以使得函数的参数更简单, 且传递的信息量是不变的。比如, void*作为参数时可以把任意的指针变量传递到函数内部进行相关的操作。

下面我们来看一个具体的例子。数据的内存布局如下图所示, 首先是一个字符型数据, 紧接着的是两个整形数据, 最后面是三个结构体A型数据。我们需要做的就是把这些数据读出来。

我们先声明一个字符型的指针p, 使其指向第一个数据的内存地址。取完第一个字符型数据后, 通过p++, 然后强转指针为整形指针, 就可以很方便地取出整形数据, 同理可取出三个结构体数据。

指针作为参数

先看一个例子, 我们有两个整形变量, x的值为777, y的值为888, 现在想构建一个函数用来交换两个整形变量的值, 使得x的值为888, y的值为777。首先我们以传值的方式构建

我们调用函数swap_value (x, y) 后, 发现x、y的值并没有被交换。造成这种结果的原因是由于函数调用时, 首先对传入的实参进行变量的拷贝, 交换的值是形参的值, 并不是实参的值。而原来的实参与拷贝后的形参变量所处的内存也不同, 所以并没有交换成功。

要想实现函数内部对这两个值的交换, 必须使得实参与拷贝后的形参变量所处的内存是相同的。我们知道了原理后, 修正函数参数列表, 以指针的方式重新构建函数如下:

这时候我们发现x、y的值被交换了。通过上面的例子可以看出, 使用指针作为参数可以修改原来的变量值, 使得函数实现的机能更加模块化, 方便了程序的设计。

野指针

前面我们已经讨论过指针变量同内存的关系, 了解了指针变量里面存放的是某个变量的内存地址, 该地址可以在程序的某个位置使用, 以方便我们更改或取得该变量的值。指针使得我们拥有了操控内存的利器, 但同时指针也是一把双刃剑。我们必须时刻确保指针变量的值是我们意图操控的内存地址。如果指针变量的值被不受控的更改或者初始化不正确, 那么我们就使用了错误的地址, 从而导致程序错误, 通常我们称这个导致程序错误的指针变量为野指针。由于使用了野指针而产生的程序错误大多时候是隐蔽的, 难于跟踪的。野指针的产生主要是由于以下几种情况。

(1) 声明了指针变量, 但是没有正确的初始化就使用了该指针变量。

(2) 使用指针变量之前没有对其进行安全检查。

(3) 指针指向的内存变为了无效值, 但没有及时对指针清零, 导致程序某处引用了该指针。

(4) 多个指针同时指向同一内存区域, 程序某处通过某个指针释放了该内存, 但是没有及时对其他的指针清零, 导致程序某处进行了错误的引用。

(5) 多线程时, 对全局的指针变量没有进行锁处理。

多级指针

定义一级指针我们使用一个‘*’, 在定义多级指针时, 是几级指针我们就使用几个‘*’。例如, 声明一个整型的二级指针 (int ** ppVar;) 。下面以这个二级指针为例说明一下二级指针的意义。

二级指针变量同样是保存了一个地址, 这个地址就是某个一级指针变量的地址, 而一级指针变量里面保存了最终需要操作的变量的地址, 如下所示。

二级指针变量的值为0x4323640, 就是一级指针变量pVar的地址, 变量pVar的值为0x4323668, 就是变量Var的地址。如果需要修改变量Var的值, 我们可以直接修正**ppVar的值就可以了。

三级指针或者更多级指针的原理与二级指针的原理是相同的, 只是需要索引的内存空间的深度增加了。在程序设计中, 引入多级指针更多的时候并不仅仅是为了关注最后一级指针所能取得的变量, 而更多的是为了使用和操控其中间的级数的内存值。比如利用二级指针作为函数的参数在某个函数内部对其分配内存, 我们更想利用的是一级指针变量自身。当然, 在进行程序设计时, 有时我们要在可读性与语法有效性之间做出选择, 在实现代码的过程中能用低级指针实现的尽量不要使用多级指针实现, 这样的代码更利于维护。

小结

在C语言中指针的使用非常的广泛, 有时指针是实现某个计算的唯一方法。同样的机能使用指针通常也可以获得更加高效、紧凑的代码。指针使得函数构建的机能更加的模块化, 使得函数参数栈更加的短小。同时在操纵字符串的运算中, 指针更加简单直观。

在大项目构建时, 把函数指针同数据封装在一起能够使得代码编程面向对象的结构, 使得后期代码的维护成本大大降低, 代码的表现也更加具有现实意义。

C语言教学探讨 篇8

实用型本科和高职高专类高校的迅速发展, 对《C语言程序设计》这门传统的计算机课程提出了更高的要求。在C语言的教学中, 更好地帮助学生参加《全国计算机等级考试》和《全国计算机技术与软件专业技术资格 (水平) 考试》, 掌握C语言的精髓, 养成良好逻辑思维方式, 为其今后进一步学习计算机知识打下坚实的基础, 是大家十分关切的问题。为此, 笔者结合自己的教学研究与实践, 从课堂教学、上机实验、课程的综合应用、考试设计等方面阐述对C语言的教学的一点体会。

二、改革教学方法, 掌握程序设计课程教法

1. 培养学生对C语言的兴趣。

相对于其他基础课程中比较直观的基本操作和基础概念, 《C程序设计》则注重由设计算法到书写程序并进行调试的整个过程, 显得抽象、复杂, 编程时容易出错, 很难掌握很多学生因而失去学习的兴趣, 丧失学习的信心, 缺乏必胜的勇气。建议第一次上课时要给学生讲清楚C语言的功能、作用, 并利用多媒体投影, 给出几个最简单的程序进行调试, 运行得出结果, 并给出一些用C语言编写的小游戏, 如俄罗斯方块、五子棋, 提高学生的学习兴趣。

2. 恰当地利用多媒体教学, 夯实基本知识, 基本技能。

众所周知, 运动的物体较静止的物体容易引起人的注意, 而多媒体课件具有极强的动态演示的优势, 因此我们可以利用多媒体课件建立鲜明、准确的第一印象。例如在讲汉诺塔问题时, 我们可以用多媒体形象、生动地演示该过程, 通过多媒体课件这种渐进演变的功能, 我们可以较好地控制引导学生的思维过程, 从量变到质变让学生对递归这一过程的正确理解, 而不过多地纠缠于盘子的移动。

多媒体课件在课堂上的应用, 可激发智慧潜力, 促使学生主动地获取认识问题的各种信息, 掌握分析问题的各种方法, 找到解决问题的办法, 从中掌握知识的内在联系, 巩固形成的认知, 使学生获得更好的学习方法。

当然我们也不能完全依靠多媒体教学, 过多的信息量会引起学生的视觉疲劳, 依赖心理加重, 上课被动地观看动画演示, 不能有效地形成自己对事物正确的看法。如一些编程思想, 算法的步骤等等, 如果只是利用多媒体演示, 效果不好。我们要通过板书, 给学生一段思维的时间。激发想象力, 更加有利于逻辑思维的培养。只有通过恰当的取舍, 才可以更好地进行基本知识、基本技能的培养。

3. 培养学生的编程能力。

传统C语言教学的重点不是放在如何解决问题上, 而是把大部分的时间放在讲解语法规则和语句格式上。这样做的后果就是学生一拿到任务后首先琢磨怎么定义变量, 用哪条语句, 而不是把问题进行合理的解析, 考虑最佳算法。因此在教学中重要的是教会学生学会找出解决问题的方法, 即算法。我们要引导学生学会正确的思维方法, 由易到难, 自顶向下, 逐步求精, 找出解题的关健。

例1、显示输出如下所示的图形。

这是我们在进解双重循环时的一个例子, 在 (a) 图中, 我们只需要简单引导学生找出其中规律, 学生就可以很快地找出行和列输出空格和星号之间的关系, 这样由a图演变至f图, 把一个抽象的应用题变成简单有趣的智力题, 学生的学习兴趣空前高涨, 到最后我们可以再进一步延升, 我们把图1的行进一步放大, 如果把行数定义为N (当然由于屏幕的限制不可以超出20) , 这一题又该如何解决。这样, 可以很好地锻炼学生分析问题、解决问题的能力, 又可以提高学生的想象能力和创新能力, 更好地理解二重循环的功用, 进而提高编程能力。

4. 加强实践课程的管理。

1) 进行分组教学, 一般一个班分成4个小组, 选出组长。

2) 在上机前要布置好实验题, 争取知识性和趣味性相结合, 基础题和提高题相并重。

3) 在上机时, 要求每位学生把自己编写的源程序上传至教师指定的计算机 (要求内网连通, 个别计算机可以用U盘复制)

4) 在学生上机之前随机抽取3-5人的程序在多媒体投影进行快速讲解, 并进行编译、调试运行, 这样教师可以知道学生们的薄弱环节, 随之进行讲解, 然后学生可以自我上机, 基础弱的学生可以重复教师讲解的基本题, 中等的学生可以做同样类型题目, 学有余力的学生可以做提高题 (在教师对基础题进行检查以后) , 在这一过程中, 提倡学生相互之间探讨。

5. 课程的综合应用。

在课程的结束, 我们可以结合专业实际, 让他们进行分组案例研究, 要求他们严格按照软件工程的思想去做, 从问题定义、可行性研究、需求分析、总体设计 (概要设计) 、详细设计、编码与单元测试、综合测试、软件维护让他们在做项目的过程, 从而锻炼学生运用C语言解决实际问题的能力, 并学会分工合作, 培养团队精神。

三、结束语

案例教学为广大教育工作者所采用, 知识及技能的传授以完成典型“任务”为主, 计算机上机实践教学中更能体现其优点, 有利于提高学生自主学习和探索的能力。要使学生上机实验取得好的效果, 设计好实验案例是关键, 它包括任务的提出与分解、最终达到的目标、解决问题的方法。教师应根据实验任务, 设计好的案例, 以取得更好的教学效果。

摘要:C语言是计算机教学的重要内容, 由于内容繁杂, 逻辑性较强, 也是一门难学和难教的课程。鉴于此, 笔者结合自己的教学实践, 讨论C语言教学中的几点问题, 以促进C语言教学。

关键词:C语言,多媒体教学,二级,软考

参考文献

[1]谭浩强.C程序设计.清华大学出版社, 2002.6.

[2]王琪, 周彩根.C语言程序设计.课程建设的研究与实践.中国成人教育, 2007.12.

C语言教学探讨 篇9

1 教学中的问题

C语言教学过程中除了需要平衡语言特性和程序设计能力培养外,还应针对教学对象的特点进行内容的合理编排,加强各个知识点的联系,降低学习曲线的陡峭程度。当前众多教材及教学过程在内容编排上采用类似自顶向下的教学方法,简述变量、常量等基础概念后,在控制结构中开始程序设计能力的初步培养,到数组、指针及函数参数部分转而强化底层概念,最后通过结构体、综合示例及简单数据结构等回归到设计[1]。这样的教学过程可能会使部分学员在对前期语言基本要素掌握不到位的基础上产生一些错误理解,后期再来修正就比较困难。

结合个人教学经验及我校的教学情况,在课程编排上应尽早让学员理解并熟悉底层概念,尽早引入函数概念并持续培养模块化程序设计方法[2]。前期教学重点讲述核心概念及常规用法,加深学员对语言整体的理解,后期重点培养程序设计和计算思维能力①。

2 具体改进

2.1 坚持清晰第一

任何课程,每次课堂的教学都应遵从清晰第一原则,C语言教学也不例外。清晰第一的一个功能是重点突出。对C教学而言,讲解所用的代码表述要保证清晰明了,不要过多讨论i+++j等问题,避免由于写法的技巧性和语法的复杂性加重学员学习负担。有文章列出的一些“有趣C问题”并不能提高大部分初级学员的兴趣,反而可能会使其产生挫败感并导致厌学心态,这样的东西在教学初期应该适度引入。清晰第一的另一个功能是避免了部分的不可移植性问题及潜在的错误。在C语言中存在表达式计算的副作用和顺序点问题,对int i=1;f(i++)+g(i--)没有约定是进行f(1)+g(1)还是f(1)+g(2),利用本原则可以消除由于此类语义表述所埋下的隐患,突出避免编写依赖特定计算顺序表达式的重要性。另外,清晰第一还体现在可读性上,排版、注释、标识符命名及编程风格等方面,需持续培养学员良好的编程习惯,尽力使教学与实际开发保持一致。清晰第一要避免对晦涩用法的讲解和考核但不是简单反对和抛弃惯用的简洁描述,课堂上应该给出习惯用法以体现C语言的灵活性。

2.2 强化类型概念

类型体现了抽象,抽象是人认识客观世界的主要能力。类型作为计算机科学的核心概念在众多C语言教材中阐述并不多,教学过程中理应让学员对此留下深刻印象。讲解中通过整数的补码表示,字符型的ASCII编码等让学员明确计算机对不同信息的分类表示。由此引出,类型约定了表示的形式,进而限制了存储空间的大小和取值范围。初期讲解常量时用printf()的不同格式描述符验证int和double的编码不同,结合sizeof运算符验证不同类型的存储大小,并在介绍位运算后深入了解整型的补码编码方式。利用求余运算符的两个操作数为整数而非浮点数,验证类型对操作的限定,引出类型在另一方面又约束了其上的相关操作。类型概念应该在课程教学的各个章节进行强化,比如后续讲解指针运算只有加减和比较操作时可再次强调。同类型之间可直接操作,异类间操作需先统一为同种类型,重视了类型问题也就便于掌握类型转换,减少了转换出错的概率。面向对象的程序语言强化了C语言本就具有的这个核心概念,并发展到了一个新高度,C中类型的这两个能力与面向对象的理解基本一致,掌握好该核心概念也有利于后续面向对象程序设计语言的学习。

2.3 深入理解变量与赋值适度引入指针

C语言兼具高级语言和低级语言的特点,其实现与内存关系紧密。变量的功用是保存信息以便后续使用,信息的类型不同变量类型的选择也就不同。讲解时无需简单罗列所有变量类型,建议把整型变量单拿出来细讲,这样学员理解好了一个,也就方便了后续其他类型的学习。让学员理解变量名屏蔽了底层地址信息所带来的使用方便性,以及掌握利用底层地址信息进行间接访问操作的一致性。对整型变量int i;通过printf(“%d,%p”,i,&i)引出%p格式描述符和&取地址运算符以验证变量的存储内容和存储起始地址,并指出变量初始化的重要性。进一步用printf(“%d,%p,%d”,i,&i,*&i)引出用地址求值的间接访问运算符*,为指针的引入建立基础。C语言的赋值并非数学中的相等比较,示例中用i=1与j=i,强调i在等号的左边表示存储位置,在等号的右边表示存储内容,由此引出左值和右值概念,明确左值是能指代存储空间的对象,从而避免i++++此类错误操作。通过赋值操作符设问如何保存地址信息从而完整地引出指针类型,用示例强化指针相关的两个重点操作&,*。再次结合sizeof查看多个同类型变量的内存分布,以引出指针的加减及比较操作,并由不同指针类型间转换引出void*这个类型转换桥梁,以方便后期数组、结构体等教学。至此,完成对指针涉及的所有基础知识讲解,后续课程重点讲其应用即可。有了这些概念后引出scanf以尽快开启交互式程序的设计,提高学习兴趣。

2.4 尽早引入函数

个人认为很多教材将函数放在课程后半部分讲是不合理的。为了便于学员理解到函数及模块化的重要性,尽早接触到结构化程序设计思想,建议在赋值语句和表达式之后就以“命名的语句块”方式初步引出函数概论以熟悉基本框架和使用,并在后续章节逐步深入。在控制结构中结合函数进行基本编程能力的培养,重视函数设计的通用性[3]。讲解函数时,不必按参数、返回值等对函数进行分类,重点应该从主调和被调,从使用和实现的角度出发,对比两者对函数的关注点和关注内容的不同,体现出接口的重要性,并让学员在设计与调用时做到清晰明了。需强调函数参数的值传递方式而无需引入地址传递等其他表述以减轻学习负担。对函数调用栈状态变化的讲解要简明扼要,以清晰值传递的实现基础,并体会语句块内局部变量的概念,为后续变量作用域和存在期讲解打下铺垫。在具有指针的基础概念上对比void func1(int a){a++;}和void func2(int*a){(*a)++;},前者用复印件的类比说明修改不涉及原件,后者用钥匙的类比说明直接修改原件,以及利用2值交换函数理解函数内修改函数外数据时利用指针间接访问所带来的便利性。由于程序运行时存储在内存,其中的所有对象都有地址信息也包括函数,由此引出函数指针及其基本用法。关于递归的讲解涉及的是程序设计方法与机器细节相关不大,重点通过简单示例强调思维方式。对汉诺塔、二叉树遍历等经典例子以及数据结构与算法基础内容等可在课程的后半部分单设常用编程技术章节专门提高程序设计能力。

2.5 清晰数组概念

由于前述教学安排,数组可放到指针及函数之后讲解。对该概念的引入可以提两点,一是便于大量同类型变量的定义及使用,int a[1000]比a1,a2...a1000方便定义,下标操作方便使用;二是内存采用连续地址空间实现数组,存储的空间顺序性保证了元素间关系的顺序性,使得数组成为多种数据结构实现的基础。强调数组名代表整个数组对象从而不具有左值特性,也就无法进行整体赋值和a++等操作。对数组名用sizeof(a)计算整体占用空间,引出sizeof(a)/sizeof(a[0])的习惯用法。强调数组名a的类型类似int*const指针,值为头元素地址,即a等值于&a[0],可对其加减以获得特定指向。结合int(*p)[1000]=&a;指出a,&a二者值相等但类型不,并在示例中利用a+1,&a[0]+1,&a+1结合内存模型进行验证。既然数组名类似指针,也就引出数组表示和指针表示的统一性,即a[2]等价于*(a+2),由加法交换律*(a+2)等价于*(2+a),也就解释了2[a]这种奇怪写法的存在,同理也解释了1[“abc”]是什么。对数组用a[-1],a[-2]示例编译器不进行访问越界的检测,体会不可控越界的危险性。联系到函数参数传递时,用swap(int a[],int b[])与swap(int*a,int*b)完成2值交换的一致性验证数组名退化为指针类型,引出参数传递中一维数组长度信息的丢失问题,总结出函数参数中应该带入数组长度信息func(int a[],int length),并结合二维及多维数组再次强调参数传递忽略最高维的原因。后期涉及结构体讲解时,以struct B{int i[3];}b1,b2;b2=b1;做对比,突显出结构体整体赋值的特殊性,并以此讨论数组与结构体在进行函数参数传递的成本问题,以体现指针的优势。

3 结语

关于程序设计能力和计算思维的培养是个长期过程,需要在整个培养体系中利用多门课程和实践进行贯穿和深入。实践证明,当前这种教学编排强化了学员对上述重要概念的理解,知识点间联系更紧密,对事物的前因后果更清晰,在一定程度上减少了学习弯路,提高了教学效果。

参考文献

[1]谭浩强.C程序设计[M].4版.北京:清华大学出版社,2012.

[2]裘宗燕.从问题到程序——程序设计与C语言引论[M].2版.北京:机械工业出版社,2011.

C语言和汇编语言混合编程方法 篇10

汇编语言是一种面向机器的语言, 其优点是运行速度快, 占用存储空间小, 可直接对硬件进行控制。缺点是编写、调试困难、移植性差。C语言简洁、灵活、库函数丰富、调试方便、移植性好, 目前已被广泛地应用于系统软件和应用软件的开发中, 为了发挥各自优势, 取长补短, 采用混合编程。大部分程序, 如界面、人机接口 (外壳程序) 、数据处理等用C语言编写, 以提高程序的开发效率。而某些程序, 如需要缩短程序的运行时间, 或需要对硬件进行直接操作, 或需要利用操作系统的某些功能模块, 或频繁使用的程序、或需要占用内存空间少的程序 (内核程序) , 则用汇编编写, 以提高程序的运行效率。

1 嵌入式汇编

嵌入式汇编也称行内汇编, 源程序中直接插入汇编语句。汇编语句可直接访问C程序中定义的常量、变量、函数。不必考虑二者之间的接口, 方便编程。

1.1 嵌入式汇编语句的格式

格式:asm操作码操作数[;或换行]

其中:操作数可以是汇编语句中的立即数、寄存器、表达式等还可以是C中的常量、变量、标号等。分号;是汇编语句结束符, 并非注解, 要用注解, 用C的注解。如下例所示。

1.2 汇编语句访问C的数据

嵌入的汇编语句可以访问C语言程序中的任何标识符, 包括变量、常量、标号、函数名、寄存器变量、函数参数等。如下例所示。

1.3 汇编语言与C语言接口规则

(1) C语句访问寄存器, 必须在寄存器名前加一个下划线。如例2中的return_AX;

(2) asm、C语句均可以有标号, 但不能用asm语句定义标号。

(3) 汇编语句的数据定义放在函数外面, 指令放在函数里面。

所有在函数外的的汇编语句都作为数据声明处理, 即在编译器编译时会将它放在数据段中, 也就是说不可以在函数外面写汇编命令语句, 把指令当数据。

所有在函数内的汇编语句必须是指令性语句, 在编译后都放在代码段中。也就是说不可以在函数内使用汇编数据定义语句, 把数据当指令。

(4) 不要在以asm开头的语句中使用C语言的关键字, 这会导致编译错误

1.4 编译过程

命令行键入命令:TCC-B-Iinclude-Llib文件名.c即可.TCC会自动调用TASM.EXE和TLINK.EXE, 并且TLINK.EXE能正确的找到需要的.obj和.lib文件, 要保证TC目录下存在TASM.EXE文件。如果单步编译, 可能会碰到很多的问题, 主要是TLINK.EXE不会自己去找.obj和.lib文件。该命令的功能是:.C→编译TCC→.ASM→汇编TASM→.OBJ→连接TLINK→.EXE。

2 Turbo C模块连接方式

C、汇编程序各自编程, 各自编译, 然后连接在一起。

2.1 汇编语言与C语言接口规则

(1) 命名约定:汇编的名字前加一个下划线, C的名字前不加下划线 (编译后内部自动加) , 以确保两个模块内部名字一致。

运行结果是:456B123

但是, 如果汇编程序设置采用C语言类型, 则标识符前不加下划线, (汇编后内部自动加) , 以确保两个模块内部名字一致。

(2) 声明约定:汇编、C模块对自己未定义但要用的别的模块的名字要声明。

C模块声明格式:函数声明格式:extern类型函数名 (形参表) ;如例5 z1.c。

变声明格式:Extern类型变量;

汇编模块声明格式:函数声明格式:extern函数名:属性 (near, far) 。

变声明格式:Extern变量名:属性 (byte, word, dword等)

自己定义的可供别的模块引用的也必须声明。

汇编模块声明格式:PUBLIC名字 (变量名或函数名) 如例6 z2.asm。

C模块声明格式:全局变量, 函数名前不加static即可。

(3) 寄存器要保护:C调汇编程序时, 汇编子程序中用到的寄存器最好全部保护, 退出时恢复, 以免影响主程序C的执行。

(4) C、汇编程序存贮模式要一致。

2.2 编译连接

(1) TASM文件名, 把汇编程序翻译成目标程序。TCC C文件名, 把C程序翻译成目标程序, C只编译不连接。 (2) TLINK把若干个目标程序连接成一个EXE程序。 (3) 运行。

3 结语

混合编程, 主要涉及接口, 汇编调C的函数、全局变量。C调汇编的函数、变量。本文对此做了浅述。

参考文献

[1]谭浩强.C语言程序设计[M].清华大学出版社, 2004.

[2]丁爱萍.C语言程序设计实例教程[M].西安电子科技大学出版社, 2006.

上一篇:喉癌患者围手术期护理下一篇:光伏发电的效率计算