c语言范文

时间:2023-03-11 13:49:58

c语言

c语言范文第1篇

关键词:C#;C;C++;商业软件的开发

C#,发音同“see sharp”,是一门简单、现代化、面向对象类型安全的编程语言,C#属于C语言家族,任何c、c++或Java程序员都不觉得它很陌生。C#是来源于Java的,通俗地说,他算是Java的儿子,但是它又比Java更加具有灵活性,在.NAT的编程上独树一帜,没有单独的头文件,也不需要按照特定顺序声明方法和类型。C#程序比C和C++的生成过程简单,C面向过程C语言是目前世界上流行、使用非常广泛的高级程序设计语言。C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其他高级语言,许多大型应用软件都是用C语言编写的。C语言具有绘图能力强、可移植性的特点,并具备很强的数据处理能力,因此适于编写系统软件、三维、二维图形和动画,它是数值计算的高级语言。c++是面向对象的,C是面向过程的。C++一种混合语言,目前功能最为强大的语言,面向对象技术,是程序设计“方法学”方面的一次革命,是目前软件开发中的主流技术。C++提供了面向对象的编程方法,而C没有。此外,从语言的角度来讲,C++对C的一些重要概念,如函数、指针和结构等都添加了新的增功能,C#面向对象,只能在支持.net的windows在计算机上运行,语法和Java相近,来自Microsoft。

例如,在ProgrammingGuide命名空间的顶级使用三个成员定义了MyCustomClass,在Program类的Main方法中创建了MyCustomClass的一个实例(对象),并使用点表示法访问该对象的方法和属性。

namespace ProgrammingGuide

{public class MyCustomClass

{public int Number{get;set;public int Multiply(int num)

{return num * Number;}

public MyCustomClass()

{Number=0;}

}

class Program

{static void Main(string[]args)

{MyCustomClass myClass=new MyCustomClass();

myClass.Number=27;

int result=myClass.Multiply(4);

}}}

在这段代码中,我们可以看到它有很多优点,它是一种精确、简单、类型安全、面向对象的语言。

但是在实际开发中,笔者所谈到的,只是其中的冰山一角,它除了以上的优点,还具有以下优势:

第一,快速应用开发(RAD)功能。支持快速开发,可以说是目前开发语言最为重要的一大功能,C#与.NET的结合支持快速开发,可以使得开发人员的开发效率倍增,从而使得它们可以从繁重的重复性劳动中解放出来。

第二,语言的自由性。用C#编写的程序能最大限度地和任何支持.NET的语言互相交换信息,能与其他.NET语言有着最好的合作。

第三,强大的Web服务端组件。在C#的Web编程中,包含了大量的Web服务端组件,有了这些强大的组件,可以设计出功能更加强劲的企业级分布式应用系统。

第四,支持跨平台。C#编写的应用程序具有强大的跨平台性,这种跨平台性包括C#程序的客户端可以运行在不同类型的客户端上,如PDA、手机等非PC装置。

第五,与XML的融合。XML技术真正融入.NET和C#之中,使得C#提供给程序员更多的自由和更好的性能来使用XML。

第六,对C++的继承。C#继承并保留了C++强大的功能,还提供了一些新功能取代了一些原来的ANSIC预处理程序功能,提高了语言类型安全等安全性。

C#还提供了一些特性来帮助和构建健壮、耐用的应用程序:垃圾收集(Garbage Collection)会自动回收不再使用的对象所占用的内存;异常处理(exception hardling)提供了一种结构化且可扩展的方式来检测错误和恢复;而语言的类型安全(type-safe)设计则可以防止读取未始化的变量、数组越界或进行未检查的类型转换。所有C#类型都拥有统一的类型系统(unified type system),包括int和double这样的基础类型,都是从根类型object继承而来。所以,所有的类型都有一些通用的操作,任何类型的值都可以通过一致的方式进行保存、传递和操作。此外,C#还支持用户自定义引用类型和值类型,允许动态分配对象和轻型结构的内联存储。为了保证C#程序和类库能以兼容的方式向前发展,C#在设计过程中非常注意版本控制(versioning)。很多编程语言都对这一点比较疏忽,所以当新版本的依赖库被引用时,被这些语言编写的程序都失灵了。

正是因为C#面向对象语言的卓越设计,使它成了构成各种应用程序组件的理想之选,尤其是系统级的应用程序和高级的商业对象。其次,C#语言允许自定义数据类型,以扩展元数据,这些元数据可应用于任何对象。项目构建者可以定义领域特有的属性并把它们应用于任何语言元素――类、接口等。然后,开发人员可以编程检查每个元素的属性,所以很多工作都变得简单了。例如,编写一个小工具来对每个类或接口是否被正确定义为某个抽象商业的一部分进行检查,或者只对一份基于对象的领域特有属性的报表进行创建。程序代码和定义的元数据之间的紧密对应有助于加强实际实现和程序的预期行为之间的对应关系。最后,C#增强了开发者的工作效率,并且当程序中出现错误,会有提示和解决方案,大大减少了编程中会出现的错误。同时,C#使C/C++程序员可以快速进行网络开发,也维持了开发者所需要的灵活性和强大性。

参考文献:

[1] 顾雁宏,徐旭明. C#程序设计语言[M].北京:机械工业出版社,2009.

[2] 陈语林,唐文新,熊炎. C#程序设计[M].北京:中国水利水电出版社,2012.

c语言范文第2篇

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

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

#include

intcmp(int first, int second)

{

return ( first > second ? first : second );

}

int main(intargc, char **argv)

{

inti = 5;

int j = 9;

returncmp(i, j);

}

首先,编译器会为变量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。首先我们以传值的方式构建

voidswap_value(int Param1,int Param2)

{

int Temp = Param1;

Param1 = Param2;

Param2 = Temp;

}

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

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

voidswap_value(int*Param1,int*Param2)

{

int Temp=*Param1;

*Param1=*Param2;

*Param2=Temp;

}

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

野指针

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

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

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

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

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

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

多级指针

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

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

0x4323640 0x4323668

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

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

小结

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

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

c语言范文第3篇

C语言的动态存储管理由一组标准库函数实现,其原型在标准文件<stdlib.h>里描述,需要用这些功能时应包含这个文件。与动态存储分配有关的函数共有四个:

1)存储分配函数malloc。其函数原型是:voidmalloc(unsignedintsize);其作用是在内存的动态存储区中分配一个长度为size的连续空间。这里的size是一个无符号整型,malloc的返回值为void类型,它分配一片能存放大小为size的数据的存储块,返回指向该存储块起始地址的指针值;如果不能满足申请(例如内存不足)就返回空指针NULL。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操作。

2)带计数和清0的动态存储分配函数calloc。其函数原型是:

void*calloc(unsignedn,unsignedsize);参数size意指数据元素的大小,n指要存放的元素个数。calloc将分配一块存储,其大小足以存放n个大小各为size的元素,分配之后还把存储块里全部清0(初始化为0值)。如果分配不成功就返回NULL。

3)动态存储释放函数free。其原型是:voidfree(void*p);其作用是释放指针p所指的内存区,使这部分内存区能被其它变量使用。p是调用calloc或malloc函数时返回的值。free函数无返回值。如果当时p的值是空指针,free就什么也不做。注意,调用free(p)不会改变p的值(在函数里不可能改变值参数p),但被p指向的内存区的内容却可能变了(可能由于存储管理的需要)。释放后不允许再通过p去访问已释放的区,否则也可能引起灾难性后果。由于内存区域有限,每个程序都应尽量节省资源。当所分配的内存区域不再使用时,就应及时将它释放,以便其它的变量或者程序使用,这应该成为习惯。这时就要用到free函数。

4)分配调整函数realloc。其函数原型是:void*realloc(void*p,unsignedn);其作用是更改以前的存储分配。在调用realloc时,指针变量p的值必须是调用calloc或malloc函数时返回的值,参数n表示现在需要的存储块大小。realloc在无法满足新要求时返回NULL,同时也保持p所指的存储块的内容不变。如果能够满足要求,realloc就返回一片存放大小为n的数据的存储块,并保证该块的内容与原块一致:如果新块较小,其中将存放着原块里大小为n的范围内的那些数据;如果新块更大,原有数据存在新块的前面一部分里,新增的部分不自动初始化。如果分配成功,原存储块的内容就可能改变了,因此不允许再通过p来使用它。请注意:通过动态分配得到的块是一个整体,只能作为一个整体管理。在调用free(p)或者realloc(p,……)时,p当时的值必须是以前通过调用存储分配函数得到的,绝不能对指在动态分配块里其它位置的指针调用这两个函数,更不能对并不指向动态分配块的指针使用它们,那样做的后果不堪设想。

二、使用动态存储管理的要点

1)必须检查分配的成功与否。常的解决办法是,在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。如果是用malloc或new来申请内存,则用以下语句来防错:if((p=(...*)malloc(…))==NULL){……/*对分配未成功情况的处理*/}。2)系统对动态分配块的使用不做任何检查。编程序的人需要保证使用的正确性,绝不可以超出实际存储块的范围进行访问。例如在使用数组时经常发生下标“多1”或者“少1”的操作。这种越界访问可能造成大灾难。3)一个动态分配块的存在期并不依赖于分配这个块的地方。在一个函数里分配的存储块的存在期与该函数的执行期无关。函数结束时不会自动回收这一存储块,要回收这种块,唯一的方法就是通过free释放(完全由写程序的人控制)。4)如果在函数里分配了一个存储块,并用局部变量指向它,在这个函数退出前就必须考虑如何处理这个块。如果这个块已经没用了,那么就应该把它释放掉;如果这个块还有用(其中保存着有用的数据),那么就应该把它的地址赋给存在期更长的变量(例如全局变量),或者把这个地址作为函数返回值,让调用函数的地方去管理它。5)其它情况也可能造成存储块丢失。例如给一个指向动态存储块的指针赋其它值,如果此前没有其它指针指向这个块,此后就再也无法找到它了。如果一个存储块丢失了,在这个程序随后的运行中,将永远不能再用这个存储块所占的存储。6)计算器系统里的存储管理分很多层次。一个程序运行时,操作系统分给它一部分存储,供它保存代码和数据。其数据区里包括一块动态存储区,由这个程序的动态存储管理系统管理。该程序运行中的所有动态存储申请都在这块空间里分配,释放就是把不用的存储块交还程序的动态存储管理系统。一旦这个程序结束,操作系统就会收回它占用的所有存储空间。

三、关于动态调整策略

我们可以将一个动态分配的,能存储许多元素的存储块可以看成一个“数组”,要实现这样一个能在使用中根据需要增长的“动态”数组,需要考虑所采用的增长策略。

一个简单而直接的想法是设定一个增量,例如10,一旦存储区满时就把存储区扩大10个单元。仔细考虑和计算会发现这样做有很大的缺限。实际中对存储量的需要常常是逐步增加的。一般说,在遇到存储区满时,实际上需要另外分配一块更大的存储区,并需要把原块里已有的元素复制到新块里。realloc完成这种操作的代价通常与原有的元素个数成正比。

四、函数、指针和动态存储

如果需要在函数里处理一组数据,并把处理结果反应到调用函数的地方,最合适的办法就是在函数调用时提供数组的起始位置和元素数目(或者结束位置)。这时函数完全不必知道用的是程序里定义的数组变量,还是动态分配的存储块。例如,我们完全可以用如下方式调用筛法函数:intns[1000];intmain(){inti,j;sieve(1000,ns);for(j=1,i=2;i<=n;++i);if(ns[i]==1){printf("%7d%c",i,(j%8?'''''''':''''\n''''));++j;}putchar(''''\n'''');return0;}

在前一节的筛法程序实例里,我们在主函数里通过动态分配取得存储,而后调用函数sieve,最后还是由main函数释放这块存储。这样,分配和释放的责任位于同一层次,由同一个函数(函数main)完成。这样做最清晰,易于把握,是最好的处理方案。

但也存在一些情况,其中不能采用上述做法,例如上面的直方图程序。程序里定义了一个读入函数,它需要根据输入情况确定如何申请动态存储。这时的动态存储的申请在被调用函数readscore的内部,该函数完成向存储块里填充数据的工作,最后把做好的存储块(就像是一个数组)的地址通过返回值送出来。调用函数(main)用类型合适的指针接收这个地址值,而后通过这个指针使用这一存储块里的数据。

首先,这一做法完全正确,因为动态分配的存储块将一直存在到明确调用free释放它为止。虽然上述存储块是在函数readscores里面分配的,但它的生命周期(生存期)并不随该函数的退出而结束。语句:

scores=readscores(&n);使scores得到函数readscores的运行中申请来并填充好数据的存储块,在main里继续用这个块是完全没问题的。当然,采用这种方式,readscores就不应该在退出前释放该块。注意:上面的调用除了传递有关的数据外,实际上还有存储管理责任的转移问题。在readscores把一块存储的指针通过返回值送出来时,也把释放这块存储的责任转交给main。这样,我们也可以看出前面的程序忽略了一件事情,在那里没有释放这一存储块。应做的修改就是在main的最后加一个释放语句(当然,由于main的结束就就是整个程序的结束,未释放的这块存储也不会再有用了。如前所述,在这个程序结束后,操作系统将会回收这个程序占用的全部存储)。

现在考虑readscores的设计里的一个问题。在前面的程序里,readscores通过int指针参数(实参应该是一个int变量的地址)传递实际读入数据的个数。另一种可能做法是让函数返回这一整数值,例如将其原型改成:intreadscores(???);这样,我们在main里就可以写如下形式的调用:if(readscores(……)<=0){……}/*产生错误信息并结束程序*/(这一写法使人想起标准库的输入函数scanf)。如果这样设计函数,调用readscores的地方就需要通过实参取得函数里动态分配的存储块地址。也就是说,要从参数获得一个指针值。问题是,这个函数的参数应该如何定义呢?答案与其它情况完全一样。如果我们想通过实参取得函数里送出来的一个int值,就要把一个int变量的地址送进函数,要求函数间接地给这个变量赋值。同理,现在需要得到一个指针值,就应该通过实参把这种指针变量的地址送进去,让函数通过该地址给调用时指定的指针变量赋值。这样,修改后的函数readscores的原型应该是:intreadscores(double**dpp);

总的说来,我们介绍了指针、函数与动态分配之间的一些关系,并讨论了几种不同的处理技术。只要有可能,在程序里最好使用第一种设计,因为它最清晰,也最不容易出现忘记释放的情况,如果不得已而采用了其它方式,那么就一定要记得存储管理责任的交接问题,并在适当的地方释放动态分配的存储区。

摘要:本文探讨了C语言的动态存储管理的实现、使用要点、动态调整策略等方面内容,以其对有关人员提供参考/

关键词:C语言;动态;存储;管理。

c语言范文第4篇

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

“指针”是C语言中广泛使用的一种数据类型,运用指针编程是C语言最主要的风格之一。利用指针可以表示各种数据结构,它与函数、数组的使用和传递数据有密切联系,能方便地访问数组,还能像汇编语言一样处理内存地址,从而编出精致而高效的程序。指针极大地强化了C语言的功能。学习指针是学习C语言最重要的一环,能否正确理解和使用指针是判断是否掌握了C语言的重要标志。但是指针也是C语言最危险的特性,如果使用不当,则很容易指到意想不到的地方,产生错误也很难发现。因此,对于初学者来说,应特别注意指针的应用。怎样才能应用好指针呢?下面笔者以在计算机C语言教学中的体会与大家进行探讨。

一、理解指针

在C语言中任何数据只要定义了,在内存中就是有一定的存储单元的。存储单元就是变量在计算机中的存储地址,指针就是用来表示这些地址的变量。所以简单地说,指针就是地址,变量的指针就是变量的地址,这里还涉及一个概念就是指针变量,所谓指针变量就是用来存放指针(地址)的变量。例如:int a;假设a的地址是2000,而2000又存储在变量point中,那么变量point就是指针的变量简称指针变量,a就是指针变量所指向的变量。很多初学者都存在这样的误区:既然指针放的是地址,而2000正好是变量a的地址,那么对于指针point就可以这样赋值:point=2000,这是错误的,这里的2000表示的不是地址是一个整型数据。所以对于指针变量的赋值只能用取地址运算符“&”进行赋值即:point=&a;&a即为a的地址。

二、指针与函数

指针作为C语言的精华有很多用途,除具有一般的功能外,其中具体特殊功能的应用总结起来有三个方面:一是用于在函数中可以返回多个值;二是可以实现动态调用函数;三是实现数组的动态定义。其中,普通变量作为函数的参数,传递的是变量的值,因此只能带回一个返回值,但在有些场合需要返回多个值,这就必须用到指针做函数的参数,因为指针作为参数传递的是地址,让实参和形参指向同一个变量的地址,N个形参所指向的变量的值改变了,N个实参的值也自然改变了,从而实现了带回多个返回值。这里举个例子,编写一个函数实现两个数从小到大输出。这个程序需要子函数实现两个数的交换,把交换后的两个值通过指针传回主函数输出,传回来的是两个值。所以普通变量做函数的参数是无法实现的,只能用指针作为函数的参数。具体实现:

子函数实现交换:

swap(p1,p2)

int *p1,*p2;

{int p;

p=*p1;

*p1=*p2;

*p2=p;

}

主程序实现调用,输出:

main()

{int a,b;

int *pointer_1,*pointer_2;

scanf(“%d,%d”,&a,&b);

point_ 1=&a;

point_2=&b;

if(a

swap(point_1,point_2);

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

}

由此可见,要通过函数调用得到N个返回值可以通过以下三步实现:(1)主调函数中设N个变量,用N个指针指向他们;(2)将指针变量作实参,将N个变量的地址传给形参;(3)通过形参指针变量指向的改变,改变N个变量的值。最后主调函数中就可以得到N个变量的返回值。

三、指针与数组

前面提到任何数据都有存储单元,都有指针。所以,从这个角度出发可以将指针分为:指向变量的指针、数组指针、字符指针、指向指针的指针、函数指针、结构变量的指针及文件指针,等等。其中,指向变量的指针就是存储变量的地址的,这是指针最简单的一种类型。那么一个变量有地址,一个数组有若干个元素,每个元素都有一个地址,所谓数组的指针,就是指数组的名称,实际上是指向整个数组空间的起始地址。数组元素的指针是数组元素的地址。例如:int a[10];int*p;这里的数组名a就是数组的首地址,本质上是一个指针。a[2]表示距离a指向空间向后2个位置所在空间中的存放的值,所以a[2]=*(a+2)。那么如果让p=a,p就是指向数组的指针,对于a我们可以做加减整数运算,利用它表示数组中任何数据的值。那么对于指针也可以通过加减整数运算来表示数组中的任何数据。指针变量加上或减区一个整数n表示把指针指向的当前位置向前或向后移动n个位置。具体移动的字节数和指针数组的类型在内存所占的字节数有关系,如果指针数组类型为整型,在内存中占2个字节,那么,指针p+1,实际上的地址值就是原址加2,对于数组元素来说就是指针向后移动一个元素。如int a[10],*p,*s;p=a;s=p+2;其中s的值表示数组中首地址向后移动2个数组元素的位置,表示a[2]对应的地址,而具体移动的字节数则为4个字节。为了表示两个地址间存在的距离,可以通过指针间的减法实现。指针之间是不能有加法操作的,指针的加减运算只能对数组指针变量进行,对指向其他类型的变量的指针变量做加减运算是毫无意义的。而且两个指针变量之间的运算只有指向同一数组时它们之间才能进行运算,否则运算将失去意义。

四、结语

C语言是到目前为止学习最多的程序设计语言之一,也是国外大学计算机专业唯一的必修课程。在整个C语言教学中,指针是一个十分重要的部分,也是最难掌握的部分之一。本文从对指针概念的理解、指针在函数和数组的使用等方面系统论述了指针,目的是让大家清晰地了解指针、掌握指针,从而高效地应用指针。只有掌握好指针,才能充分发挥C语言的优势。

参考文献:

[1]谭浩强.C程序设计教程.北京:清华大学出版社,2008,11.

[2]陈刚.C语言程序设计.清华大学出版社,2010,2.

[3]魏海新,李燕.C语言程序设计实用教程.机械工业出版社,2007,7.

c语言范文第5篇

关键词:C语言 函数调用 间接访问

中图分类号:TP312 文献标识码:A 文章编号:1007-9416(2015)12-0000-00

C语言程序设计是结构化程序设计,函数是C语言的基本模块,函数调用是C语言运行的重要机制,在C语言中除了提供大量的库函数外,要实现具体的功能必须自己定义函数,定义出函数要实现的功能,使用函数的过程就是调用函数的过程,即函数间的接口,接口的实现是通过参数传递方式实现,函数调用的关键是正确传递实参值,用正确的形参变量来接收。

1 函数的定义

所谓函数定义,即定义函数功能,如求和,求最值,排序功能,用C语言提供的选择结构、循环结构写出具体的代码实现。如果函数只是完成某项特定的处理任务可以定义无返回值的函数,如果函数最后要返回结果,可以定义的返回值的函数,如下两段代码左边有返回值,右边没有返回值。

int sum1(int m)//函数头部

{ int i,sum=0;

for(i=1;i

sum=sum+i;

return sum; }

void sum2(int m)//函数头部

{ int i,sum=0;

for(i=1;i

sum=sum+i;

}

s=sum;

}

2 函数的调用

函数调用的一般形式为:

函数名(实参列表);

实参可以是常数、变量、表达式等,多个实参用逗号,分隔。

在C语言中,函数调用的方式有多种,例如:

01.// 函数作为表达式中的一项出现在表达式中

02.z = max(x, y);

03.m = n + max(x, y);

04.// 函数作为一个单独的语句

05.printf("%d", a);

06.scanf("%d", &b);

07.// 函数作为调用另一个函数时的实参

08.printf( "%d", max(x, y) );

09.total( max(x, y), min(m, n) );

在函数调用中还应该注意的一个问题是求值顺序的问题。所谓求值顺序是指对实参列表中各个参数是自左向右使用呢,还是自右向左使用。对此,各系统的规定不一定相同。

3 实际参数和形式参数

在函数定义时出现函数名后边括号里的变量就是形参,形参必须是变量,因为在函数调用时形参是被赋值对象,形参只在定义它的函数内部被访问,是局部变量。

在函数调用时出现在函数名后边括号里的常量、变量、表达式、函数等是实参,实参当前值是确定的,因为它在赋号右侧。

实参出现在主调函数中,形参出现在被调函数中。

4 传值调用和传址调用

4.1两个数对调的函数实现

#include

int a=3,b=4;

void swap1(int a,int b){//值传递,也称为单向传递

int t;

t=a;a=b;b=t;

}

void swap2(int *a,int *b){//地址传递,也称为“双向传递”,实质还是单向传递

int t;

t=*a;*a=*b;*b=t;

}

main(){

swap1(a,b);

printf("a=%d,b=%d\n",a,b);

swap2(&a,&b);

printf("a=%d,b=%d\n",a,b);

}

第一个输出结果为3,4,第二个输出结果为4,3,在这里传值调用和传址调用正确,多数教材和资料中谈到传址调用时介绍是双向传递,应该是不正确的,以下面例子为例:

4.2有下列程序

# include

void fun1(int x,int y)

{ int z;

z=x; x=y; y=z;

}

void fun2(int *x,int *y)

{ int z;

z=*x; *x=*y; *y=z;

(*x)++; (*y)++;

}

void fun3(int *x,int *y)

{ int z;

z=*x; *x=*y; *y=z;

(*x)++; (*y)++;

}

void main()

{ int a=5,b=9;

fun1(a,b);

printf("a=%d,b=%d\n",a,b);

fun2(&a,&b);

printf("a=%d,b=%d\n",a,b);

fun3(&a,&b);

printf("a=%d,b=%d\n",a,b);

}

在这个程序中有三次函数调用,第一次调用结果还第三次调用都没有改变主调函数中变量的值第二次改变了,第一次是传值调用,第二、三次是传址调用,第二次改变的实质不是因为是传址调用,而是因为使用了间接访问。

5 C语言程序设计函数使用方法

5.1函数是C模块语言的模块

C语言的基本框架是函数,函数是C语言的基本模块,在理解中列举生活中的例子,例如一个部门一开始很小,只有一个人,相当只有一个主函数,慢慢的部门壮大起来,需要的人数增多,这时候部门就可以再进一个人,那必然有一个领导另一个,领导者就是先来的人,也就是主函数,被领导者是后来的人,即被调用函数,主函数安排任务给被调函数,要把任务内容告诉被调用函数,这变是参数传递。

5.2函数代码定义过程

定义时先定义被调用函数,然后再定义主函数,这样在主函数中就不用做函数声明了。

定义被调用函数时,先把函数名字及圆括号和大括号写,里面的代码先不写。然后写主函数定义,主函数在这里没有返回值也无参,主函数的头部定义没有问题,然后先写主函数体代码,通常主函数分三部分, 输入、调用和输出,这三部分相对比较难的是调用,调用时要分析有没有返回值,有没有参数,如果有参数,有几个并且参数的类型要确定,调用时的参数是实际参数,根据实参和形参的一一对应关系,实参确定好了,形参的类型和个数自然也就确定了,这样被调用函数的头部就定义好了。

主函数定义后,被调用函数的头部也定义好了,这时候开始写被调用函数的函数体,也是编写程序最难的一部分,涉及具体的算法。

把主函数和被调用函数定义好后,在具体开发环境下编译、链接、执行,找出程序有没有语法错误和逻辑错误,最后程序得出正确的结果。

6 结语

C语言程序设计函数部分是学习难点,它把以前学的一个函数能实现的功能分在两个或多个函数中实现,并且多个函数这间有接口,接口就是函数调用时的参数传递,参数传递时又涉及到变量的作用域和生存期,函数部分把C语言的各个知识点都联接起来了,是C语言的集成和综合,所以学好函数是学好C语言的关键。

参考文献

[1] 谭浩强.C程序设计(第三版)[M].清华大学出版社,2005年.

[2] 郭继展.新编C语言程序设计[M].机械工业出版社,2003年6月.

c语言范文第6篇

忙碌了一个多星期,在大家的共同努力下,我们总算将此程序设计出来。尽管不是自己独立完成,但仍然很高兴,因为在设计的过程中,让我了解到要设计一个程序,查找资料是至关重要的,在他人的基础上,再根据自己所学进行修改与调试,最后设计出自己想要的程序,这过程艰辛,但只要你持之以恒,成功指日可待。

另外平时扎实的基础也很关键,因为如果你平时学得就不怎么样,那么你面对这么一个比较有难度的程序,你可能会望而却步,看他人的程序都是个难点,更别说让你自己去设计。为了解决此。类问题,最好就是多向同学,老师请教,不要怕难为情。

C语言课程设计和现代计算机技术的实际应用相结合,是我们在本阶段学完理论课程之后对自己该方面的能力的一次很好的检验,从开始的算法思路到运行调试后的美观的图形界面以及另人兴奋的可用程序,都是一个很好的学习和锻炼的过程。使我们巩固了原有的理论知识,培养了我们灵活运用和组合集成所学过知识及技能来分析、解决实际问题的能力。使我们体会到自身知识和能力能在实际中的应用和发挥。不但可以激发创新意识,还可以开发创造能力、培养沟通能力。这次实习时间虽然仅有一个星期,但确实使我受益非浅。通过实习我丰富了计算机操作经验,更加深了对C语言的了解,熟悉了其环境,更增强了对Turbo C的使用技巧。

二十一世纪是计算机的世纪,是一个全新的世纪,计算机正逐步入侵我们的生活。刚开始接触计算机的时候感觉很新奇,那时觉得计算机很神秘,于是就产生了以后一定要熟练掌控计算机的念头。大学的教育模式和中学有很大不同,从平常的课程安排和教学就可以知道,但是独立完成课程设计和写论文这种任务对我们来说无疑是一个很大的挑战

c语言范文第7篇

关键词:C语言;学习;编程

1 C语言的特点和优势

C语言是学习编程语言的基础,它集合了很多语言的特点,我们都知道语言之间是相同的,而C语言能够把很多语言的特点集中起来,有高级语言和低级语言的特点,能够编辑系统软件和应用软件,所以C语言是一个非常重要的语言。要想学好C语言,首先要了解下它的历史,1970年美国AT&T贝尔实验室的Ken Thompson以BCPL语言为基础设计出很简单很接近硬件的B语言,但B语言过于简单,功能有限,继而在1972年―1973年期间美国贝尔实验室D.M在B语言的基础上设计出C语言,所以C语言用起来非常的方便,能够给程序带来自由和便利,这也是很多软件用它的原因之一。在C语言的语法中,运算和程序书写是非常丰富的,在编写程序的过程中能够用到的运算方法有很多,可以实现很多高级程序无法实现的功能,使用起来灵活多样,能实现各种复杂的数据结构的运算。C语言还能够直接的访问物理地址进行各种操作,非常方便的对程序进行控制和编译。

2 学习枯燥乏味之理由

在学习C语言的过程中很多学生对C语言提不起任何的兴趣,导致在上课的时候压力很大,听不进去,甚至无法理解。C语言的功能非常强大,这是我们学习的最基本理由,而且目前C语言的用途很广,收到计算机方向的重视,所以我们也必须对自己要重视起来,大部分同学在学习起来觉得很枯燥,理论的东西很难记住,对C语言的认识也不够深入,所以会造成一个学期学完之后反过来想想,觉得一无所获。那究其缘由为何会出现这样的情况呢?

个人认为首先一个是教学方式上,C语言的理论东西偏多,不能通过一些直接的感官方式给学生,造成学生的理解困难,如果能通过很直观的方式来呈现内容的话效果应该会比较好,比如说多进行上机的操作,让程序能够通过界面的方式反馈出来等等。

其次是在C语言中有很多的算法和结构让很多同学觉得眼花,很多同学只是简单的靠记忆把他记忆下来,这样效果就很低,而且非常枯燥,应该要通过更多的实践练习掌握它们的规律和方法。

最后就是教师在教学上应该要注重教学方法,不能仅仅简单的理论教学和实践教学,应该把学生放在第一位,能够听懂才是关键,否则一堂课下来内容讲完了,学生收不到你的效果。教师在课堂讲解的过程中除了课程教授之外,还要传达C语言在整个计算机学习中的重要性,让学生更加深入的去理解和分析,增强他们的学习兴趣,这个才是关键。

3 编程技巧

同学们之所以学习的非常吃力,觉得C语言很枯燥,归根结底是没有掌握到C语言的学习技巧,其实对于初学者来说觉得学习吃力是正常的,学习任何一门语言都是有一个过程的,关键问题在于你要掌握其精髓的地方,只要掌握了重点一定能够学好语言。对于C语言我们应该要更加注重其编程技巧,接下来就阐述几个比较有用的技巧。

⑴指针掌握。指针的掌握在C语言中是非常重要的,也是C语言中一个非常重要的技巧之一。指针能够在运算的过程中提高速度,让整个编程的语句变得更加简单,不足的地方就是消耗的内存要大点,但是和整个编程语言来说微不足道,如果本身内存就有富裕的话那么就一点问题都没有了,所以同学们在学习这一章的时候一定要加强自我的学习能力,除了老师上课讲的知识之外,可以多去网上找相关资料进行补充,把指针这一章做好学习。

⑵数学知识掌握。数学知识在整个计算机学习的过程中是非常重要的,能够解决C语言中的很多问题,IT界有句话叫“数学是计算机之母”,由此可见数学在计算机学习中的重要地位。同时,在整个C语言的学习中如果能够很好的用到数学思想的话也能够促进学习,在编程之前首先进行分析,通过什么样的算法能够更加简单,这就是数学的一种运用,所以数学知识对学习编程语言非常有作用。

⑶位运算的掌握。使用位运算可以使代码更简洁,效率更高)使问题得到解决。其实在所有的计算机程序中可以说位是最小的数据单位,一般而言所有的运算和操作都可以通过“位运算”来解决,这足见“位”在编程语言中的重要性。在C语言当中去应用能够提高效率,解决更多的问题。

当然不管什么样的技巧,应该具体问题具体分析,上述只是个人的一些看法,总体来说能够提高编程效率,通过让同学们不会感到枯燥,让C语言更加广泛的应用。

4 总结

总的来说,C语言的功能非常强大,所以作为我们学生有责任要把它学好,为今后的就业打下基础。C语言作为高校的一门公共基础课,不仅仅是计算机专业开设了,其他非计算机专业的同学也要进行学习,所以学好C语言能够提高自己的编程效率和对编程语言的理解,对整个计算机语言的学习是非常有作用的。希望通过我的个人拙见,让更多的同学学习C语言,而且能够掌握,培养自己的编程能力,这样才能更好的服务社会。

[参考文献]

[1]李自清.浅谈C语言编程中的常见错误和解决方法[J].科技信息(科学教研),2007(33).

[2]李利国,王磊.C语言编程风格之六大章法[J].成才之路,2007(20).

c语言范文第8篇

【关键词】 C语言 Java语言 异同 比较 归纳

1 举例

(1)C程序。

#include “stdio.h”

void main()

{printf(“大家好!\n”);

}

(2)Java程序。

public class java1

{

public static void main(String args[])

{ System.out.println(“大家好!”);}

}

从以上程序代码上看,二者既有相似之处,又有不同。相似的是二者完成的都是向输出终端输出字符串“大家好!”,不同的是前者是用C语言的main函数来实现的,C语言中main函数是程序执行的入口;后者用Java语言的类方法main的定义实现的, Java程序中main方法是程序执行的入口。

2 起源

C语言是在70年代初由两位程序员B.W.Kernighan和D.M.Ritchit在美国贝尔实验室研究出来的。后来由美国国家标准学会制定了一个C语言标准,于1983年发表。通常称之为ANSI C,是当代最优秀的程序设计语言。

Java语言是在1995年5月由Sun Microsystems公司推出的面向对象的程序设计语言。

3 特点

3.1 C语言的特点

C语言具有简洁、紧凑,方便、灵活;运算符丰富;数据类型丰富;具有结构化的流程控制语句(if、switch、for、while语句等);语法限制不是很严格,程序设计自由度大;允许直接访问物理地址,能进行位操作,能够实现汇编语言的一些功能,可以直接对计算机硬件进行操作。因此有人又把它称作中级语言。生成目标代码的质量高,程序执行效率也非常高;程序可移植性非常好[1]。

3.2 Java语言的特点

Java语言的特点可以概括为:平台无关性、简单、面向对象、分布式、解释执行、健壮、安全性等[2]。

平台无关性是指Java语言能运行于不同的计算机平台,数据类型也与机器无关。安全性是指Java程序运行时,内存由操作系统分配,可以避免病毒侵入。另外,Java还对程序提供了安全管理器,防止非法访问;面向对象是指Java将数据和类封装在一起,利用类的特点,实现程序的简洁性和可维护性。通过类的继承性和封装性的特性,使程序代码只需编译一次,然后就可以反复利用。分布式是指Java建立在TCP/IP网络平台上。库函数提供了使用FTP和HTTP协议传送和接受信息的方法。健壮性是指Java主要致力于检查程序在编译和运行时的错误。由于Java本身操纵内存,这样会大大减少内存出错的可能性。

4 开发环境

C是面向过程的语言,运行环境主要有:TC、VC、Visual C++等,现主要使用Visual C++,它是一个功能非常强大的集成开发环境。

Java是面向对象的语言,JDK是许多初学者使用的开发环境,由一个标准的类库和一组测试及建立文档的Java应用程序组成。在Java语言学习的初期,可以在普通的文本编辑器编写Java源程序,利用Javac命令完成编译,利用Java命令完成程序的解释执行。在具备一定的的程序开发基础后,可以选择一些集成开发环境如Eclipse、NetBeans等,以便提高开发效率。

5 程序调试过程

(1)C语言程序调试以Visual C++6.0为例:下载Visual C++6.0并安装、运行,

进入后,点击文件(File)->打开(Open),选择你要打开的C语言文件,点击打开选择打开文件后,依次点击Build->Compile,编译文件无误后,按Ctrl+F5运行程序。

(2)Java语言程序调试介绍两种方法:

dos命令行运行步骤:

1)下载并安装JDK、环境变量设置:PATH、CLASSPATH和 JAVA-HOME。

2)编写:在记事本中编写Java代码,存为.java文件,文件名为代码入口类的名称。

3)编译:运行CMD进入dos系统。

输入javac代码文件名.java生成.class文件。

4)运行java程序:java*(*为主文件名)。

Eclipse运行步骤:

1)下载并安装JDK->下载并安装Eclipse 并运行,进入后点击文件(File)->新建(New)->Java项目(Java project)->输入项目名称->确定。

2)右键单击包资源管理器右键单击1)中的项目下的src节点,依次选择

新建(New)->类(class)->输入类名称->确定。

3)编写Java程序并保存。

4)运行Java程序:右键单击创建好的类文件,依次选择“run as” ->“Java Application(Java 应用程序)”—>确定。

6 应用领域

C语言是即具有高级语言的特点,又具有汇编语言的特点。它已先后被移植到大、中、小及微型机上。它可以作为系统设计语言,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写图形、动画和系统软件。

Java语言的应用领域:(1)行业和企业的信息化:如现在正在以惊人的速度发展起来的Android,它就是基于Java语言实现的手机操作系统。通过J2ME让手机可以运行Java程序,Java在手机世界的兴起对手机时代起着划时代的作用。(2)嵌入式设备及消费类电子产品:通过将Java虚拟机嵌入到其他设备中,就可以让Java在这些设备中发挥强大的作用。比如,非智能手机、机顶盒、嵌入式芯片及其他低功耗设备中都有Java的影子。(3)办公自动化:目前基于Java技术设计的办公自动化系统应用也非常广泛,如:军队办公自动化系统、网上书店系统、银行网上代缴费管理系统等。(4)辅助教学:远程教学系统、远程教育、交互式电站仿真系统等。

7 结语

在多年的C语言和Java语言课程的教学过程中,通过不断探索、学习和阅读文献,我对两种编程语言从以上几方面进行归纳,并将上述内容运用到教学中,采取比较式教学法,取得了较好的教学效果。

参考文献:

[1]姜雷,施泽全.C/C++程序设计教程.中国铁道出版社,2007,2-3.

c语言范文第9篇

关键词:Java

面向对象

c++

编程语言

中国分类号:TP312

文献标识码:A

文章编号:1002-2422(2010)03-0088-03

1 Java语言的特点

(1)简单性

Java继承了C/C++的语法,丢弃了其中不常用又容易引起混淆的功能,特别是非面向对象的内容,取消了c语言的结构、指针、#define语句、多重继承、全局变量和函数、GOTO语句、操作符重载和自动类型转换等等。

(2)面向对象

Java是一种纯面向对象的语言,具有封装、继承和多态的特性,无全局变量或函数,可以被用于面向对象这种现代软件工程。

(3)分布式

Java包括一个支持HTTP和FTP等基于TCP/IP协议的子库。因此,Java应用程序可凭借URL打开并访问网络上的对象,象本地一样。

(4)解释型

Java写成的源代码需要被编译成高阶的字节码,其与机器架构无关。然后,这种字节码在任何Java的运行环境中由Java虚拟机解释执行。保证了Java与平台无关性和可移植性。解释执行与及时编译技术的完美结合,提供了相当高的运算性能。

(5)多态的支持

Java是一种非常注重对象形态转换的语言,所以在编译时期就会做形态转换检查,在执行时期,Java也会做一些形态上的检查。

(6)垃圾收集和异常处理

由于Java垃圾收集器会做自动的垃圾收集,这里的垃圾指一些不会被再使用的对象,所以程序设计者不需费心。内存会被自动地管理,Java本身提供了许多面向对象的异常(Exception)处理,所以程序在执行时期所发生的错误,都可以由程序自己来处理。

(7)安全性

Java设计时对系统的安全,特别是网络安全做了周密的考虑。通过字节码验证、内存调用方式、资源使用权限等进行多层次的安全管理。Java被认为是在任何系统上最安全的应用程序之一。

2 Java的技术平台

Java不仅仅是一种语言,更重要是一种区别于传统系统,遵循“网络就是计算机”信条的平台技术。Java平台将面向对象系统扩展成包括程序和数据的网络计算机,而这个平台的核心就是Java虚拟机。Java虚拟机的概念和实现使Java平台成为万能开发平台,实现了Java程序“编写一次,到处运行”。Java虚拟机是一种抽象化的计算机,可以在其上面执行Java的字节码。其本身的设计原则是“小而简单”,目的是为了尽可能在所有机器上都能安装。这样的精简原则,使得其能够在现有的各种平台上都可以顺利执行,适合各种网络的环境。Java的技术平台的工作原理:第一步Java用一个编译器将源程序代码(.java)转换成可执行程序(.class),Java编译器生成的是独立于处理器结构的字节代码。第二步字节代码用一个Java虚拟机来执行,JVM是理想化的Java处理芯片,通常是在软件上实现而不是在硬件上实现。

3 Java语言和c++语言的比较

c++和Java都属于杂合语言,允许采用多种编程风格。C++是一种杂合语言,支持与c语言的向后兼容能力。由于C++是c的一个超集,所以包含的许多特性都是c语言不具备的,这些特性使C++在某些地方显得过于复杂。但在Java中,设计者觉得这种杂合并不象在C++里那么重要。JavB保留了C++的语法,但忽略了资源引用、指针算法、操作符重载等潜在危险,是C/C++的简化版本。所以Java虽然是从C++衍生出来,Java和C++之间仍存在一些显著的差异,这些差异代表着技术的极大进步,证明了Java是一种比c++更优秀的程序设计语言。从面向对象(00)程序设计的角度,论述一下Java和C++的重要差异:

(1)单根结构

在c++中,可在任何地方启动一个新的继承树,所以最后往往看到包含了大量树的“一片森林”。在Java中,采用了一种单根式的分级结构,因此所有对象都是从根类统一继承。尽管这表面上看似乎造成了限制,但由于每个对象肯定至少有一个object接口,所以往往能获得更强大的能力,Java的强制单根结构更好地符合了面向对象(00)语言的标准。

(2)取消指针

Java和C++用new创建一个对象的时候,例如:Strings=new String(“object”):都会获得一个对象引用。然而,C++对象引用在创建时必须进行初始化,而且不可重定义到一个不同的位置。但Java对象引用并不一定局限于创建时的位置。可根据情况任意定义,这便消除了对指针的部分需求。指针通常被看作在基本变量数组中四处移动的一种有效手段。在c++里,必须用大量采用指针指向任意一个内存位置,这同时会使其变得不安全,也是Java不提供这一支持的原因。在Java里,没有象C++那样的指针,Java允许其以更安全的形式达到相同的目标。Java没有全局函数,只有类,因而可以用传递的方式实现对象的引用。

(3)自动垃圾收集机制

Java中没有C++“破坏器”,变量不存在“作用域”的问题。Java有个finalize()方法是每一个类的成员,在某种程度上类似于c++的“破坏器”。但finalize()是由垃圾收集器调用的,而且只负责释放“资源”,如打开的文件、套接字、端口、URL等。如需在一个特定的地点做某件事情,必须创建一个特殊的方法,并调用它,不能依赖finalize()方法。由Java不支持破坏器的概念,针对类内的基础类以及成员对象,Java采用垃圾收集器自动清除,所有对象都会被当作“垃圾”收集掉。自动垃圾收集意味着在Java中出现内存漏洞的情况会少得多,但也并非完全不可能。若调用一个用于分配存储空间的固有方法,垃圾收集器就不能对其进行跟踪监视。而在另一方面,C++中的所有对象必须用finalize()方法破坏,然而,内存漏洞和资源漏洞多是由于编写不当的finalize()造成的,或是由于在已分配的一个块尾释放一种资源造成的。Java垃圾收集器是在C++基础上的一种极大进步,使许多编程问题得以解决。

(4)异常控制机制

Java的异常规范比c++的出色得多。Java中的所有异常都是从基础类Throwable里继承而来的,所以可确保得到的是一个通用接口。丢弃一个错误的异常后,不是象C++那样在运行期间调用一个函数,Java异常规范是在编译期间检查并执行的。被取代的方法必须遵守那一方法的基础类 的异常规范,可丢弃指定的异常或者从那些异常衍生出来的其他异常。这样一来,最终得到的是更为“健壮”的异常控制代码。

(5)单一继承

Java中的继承具有与c++相同的效果,但采用的语法不同。Java用extends关键字标志从一个基础类的继承,并用super关键字指出准备在基础类中调用的方法,与当前所在的方法具有相同的名字。然而,Java中的super关键字只允许访问父类的方法,亦即分级结构的上一级。通过在c++中设定基础类的作用域,可访问位于分级结构较深处的方法,亦可用super关键字调用基础类构建器,所有类最终都会从Object里自动继承。和C++不同,Java不存在明确的构建器初始化列表,但Java编译器会强迫在构建器主体的开头进行全部的基础类初始化,而且不允许在主体的后面部分进行这一工作。其语法如下:

public class A extends B{public A(String msg){super(msg);∥调用基础类构建器}pubic C(int i){ super.C(i);∥调用基本方法}}

Java提供了一个interface关键字,其作用是创建抽象基础类的一个等价物。在其中填充抽象方法,且没有数据成员。这样一来,对于仅仅设计成一个接口的东西,以及对于用extends关键字在现有功能基础上的扩展,两者之间便产生了一个明显的差异。不值得用abstract关键字产生一种类似的效果,因为不能创建属于那个类的一个对象。一个抽象类可包含抽象方法,并不要求在其里面包含什么东西,但其也能包含用于具体实现的代码。因此,其被限制成一个单一的继承。通过与接口联合使用,这一方案避免了对类似于c++虚拟基础类那样的一些机制的需要。为创建一个实例的一个interface(接口),需使implements关键字。其语法类似于继承的语法,如下:

public interface Face

public void Output():}

public class C extends B implements Face{public void Output()fSystem,out,println(“an object”),}}

4结束语

c语言范文第10篇

关键词:c语言;教学方法;思维转化;启发式教学;软件工程

一、前言

c语言是一种通用性 计算 机程序设计语言。它兼有汇编语言和高级语言的双重优点,运用它既能编写操作系统软件,又能开发各个领域的应用软件。c语言的实用性使之成为编程的首选语言。学好了c语言,再进一步深造c++/vc++,java等言语,就有了坚实的基础。但目前很多学生在学习《c语言程序设计》后,感觉读程序还凑合,编程则“难于上青天”部分学生甚至毫无编程想法,仅仅是为应付 考试 而死记硬背,完全背离了高职 教育 的初衷。因此,如何在c语言教学中启发并训练学生的编程思维,是每个教师应深思的问理。以下是笔者在c语言教学中的一些看法,愿和同行探讨。

二、上好第一堂课

如何上好第一堂《c语言程序设计》课是至关重要的。因为学生都是初次接触c语言,c语言对他们来说是神秘的,“兴趣永远是最好的老师”,有了兴趣他们才会积极主动地去学习,所以第一堂课的成功与否直接关系到学生能否对这门课产生兴趣,所以我觉得第一堂课应为“趣味c语言导学课”。

(一)程序结果展示,激发兴趣

要激发学生的兴趣。首先要让大家知道c语言的强大功能,利用它我们能编写各种软件,通过幻灯片向学生展示各种结果画面,例如从50年代玩的摇杆游戏到如今的电脑游戏。相信这时有些学生已经有些“蠢蠢欲动”了。恨不得立刻学好c语言。

(二)强调c语言的重要性

c语言是学生今后学好后继课程的基础,比如数据结构。c++,java等。虽然程序设计语言更新很快,但如果真正掌握精了程序设计思想,具备了真正解决实际问题的能力。语言再更新可程序设计的本质不会变。

(三)传授c语言的学习方法

c语言是一门实践性课程,要理论结合实践,加强学生的动手能力,解决问题的能力,在学习方法上给以学生指导,告诉学生如何自学,如何听课,如何动手实践,明确一点:“c语言不是看会的,也不是听会的,而是亲自动手实践练会的”,强调实践的重要性。

(四)认识c语言的编译环境。

在visual studio2005环境下,举出几个简单的小程序演示给他们看,并逐一讲解,引导学生自己去发现程序中存在的缺陷以及改进的方式。熟悉c语言源程序到可执行文件的整个操作流程。让他们仿照所列举的几个程序模仿着编一个小程序。

二、c语言教学方法

(一)抽象思维到形象思维的转化

让学习过程变得轻松有趣是激发学生兴趣的关键所在,c语言本身是一门极其抽象难懂的学科,把抽象的问题形象化,使本来枯燥无味的c语言变得魅力无限,符合学生的认知 规律 ,可以收到良好的效果。

(二)采用问题启发式授课,激发自主学习

针对c语言概念多,语法繁的现状,采用问题启发式教学可以将难理解、难记忆的概念和规则变成一系列时而醒目、时而深奥的问题呈现在课堂教学中,这样就能把学生的注意力集中起来,学习积极性调动起来,达到师生互动的效果,教师自问自答为主,有问有答,互问互答,改变单调死板、照本宣科的牧师讲法。这种启发式、讨论式、交流式的教法,不仅改变原来的灌输式,而且增强了学生自主学习的能力。

(三)“引申法”“框架法”和“求异法”相结合

所谓“引申法”是指是结合已经解决的问题,因势利导,引导学生在此基础上解决相关联的问题。“引申法”可以培养学生在程序设计方面的发散思维。提高程序设计中的应变能力。问题是活的,但程序是有章可循的。最终使学生明白,语法是有限的,可解决的问题是无限的。只有在分析实际向题的基础上,以清晰的思路去设 计算 法,才能举一反三,以不变应万变。

“框架法”可培养学生的全局思维和算法的整体设计能力。具体体现在两方面:一是在学生有了一点编程基础后要利用伪代码或流程图,从算法设计的角度讲解编程思路,而不应拘泥于语法细节,不分主次、逐条语句的讲解代码。通过此框架,可使初学者对函数设计的关键问题有清晰的认识,利于从统筹全局的角度去考虑问题,体现了程序设计逐步求精的思路。这样可以层次分明,突出算法设计的关键,利于培养学生的编程思路。二是在学习重点章函数时,由于新的算法已很少,主要是学习用函数调用的方法来重新编制以前所熟悉的程序,那么我们可以把着眼点放在函数的设计框架上,体现参数设计、返回值设计等关键问题,而无需细讲函数体的实现细节。

“求异法”:一个固定的问题。解决的方法可能不唯一,如果能启发学生多角度、多侧面去寻求解决问题的办法,则可激发学生思考的积极性,提高其学习兴致。在c语言中一题多解的情况有很多,有意识地引导新思路,鼓励新方法,以培养学生在编程中的求异思维,而不是死记硬背,墨守成规。

(四)理论教学与学生实践相结合,提高程序调试能力

对程序设计课来说,理论学习和上机要两手抓,两手都要抓硬。实验课不能流于形式,让学生照抄照搬,甚至身在曹营心在汉。必须给学生思考、创新的启迪,训练其实践能力,实验课要生动活泼,使学生既掌握书中的重点算法,又有充分的思考空间,让学生充分体会到顿悟和创造的乐趣。在进行每一部分的学习的时候,都应该配有相应的学生上机实践的机会。这样学生既锻炼了动手能力,又巩固了所学的知识。还应该让学生养成上机前分析题目,决定算法与数据结构,并编出程序源代码的好习惯,这样在上机时,学生就有的放矢,主要精力放在调式程序上需。对于普遍存在的问题,进行集中提示、讲解、演示以增加学生的印象。井及时检查 总结 学生上机实验的完成情况。

(五)在整个教学环节中,巧妙地引人软件工程的基本思想

计算机 科学 属工程技术科学,为使学生有良好的编程思维,应注重软件工程思想的渗透。对软件生存周期的几个阶段,即问题定义、可行性研究、需求分析、概要设计、详细设计、编码、调试、运行与维护,可以通过常规的c程序设计实例来体现,以培养学生编程中的工程思维。这样并没有费很大力气讲抽象的概念,却可培养学生在程序设计中从软件工程角度去系统分析问题的良好习惯。虽然问题小了些,但“窥一斑而知全局”,经反复强化问题求解中所蕴含的基本思想,将有效地训练学生程序设计中统筹全局的工程思维能力。

三、结束语

上一篇:无线数据传输范文 下一篇:易语言范文

友情链接