C语言函数范文

2024-07-22

C语言函数范文(精选11篇)

C语言函数 第1篇

关键词:C语言,scanf函数,格式输入

C语言本身不提供输入语句, 输入操作是由函数实现的。scanf函数就是最常用的一个, 它是C语言函数库中的“格式输入”函数。

C语言中格式输入的规定比较繁琐, 用得不对就得不到预期的结果, 而输入又是最基本的操作, 几乎每一个程序都包含它。在这几年的教学实践中, 我发现不少学生由于掌握不好这个知识点而浪费了大量调试程序的时间, 也为进一步学习造成了障碍, 因此, 这个知识点就成了教学的重点和难点。不过根据这几年的教学经验, 我觉得只要遵循规律, 精讲多练, 学生完全能够掌握这个知识点。下面我将这方面的体会进行一些归纳和总结。

首先, 要准确讲解scanf函数的一般格式, 这是教学的前提和基础:

scanf函数一般格式是:scanf (格式控制, 地址表列) ;

“格式控制”是用双引号括起来的字符串, 它包括两种信息:

a.格式说明, 由“%”和“格式字符”组成, 它的作用是将输入的数据转换成指定的格式。

b.普通字符, 即需要原样输入的字符。

“地址表列”是由若干个地址组成的表列, 可以是变量的地址, 或字符串的首地址。

如输入dog坻

则‘d’送给a, ‘’送给b, ‘o’送给c, 因为%c只要求读入一个字符, 后面不需要用空格作为两个字符的间隔, 因此‘’作为下一个字符送给b。

d.在输入数据时, 遇到以下情况时该数据认为结束。

(1) 遇空格, 或按“回车”或“跳格” (Tab) 键。

(2) 按指定的宽度结束, 如“%3d”, 只取3列。

(3) 遇非法输入。

e.可以指定输入数据所占列数, 系统自动按它截取所需数据, 如:

系统自动将123赋给a, 将456赋给

b, 此方法也可用于字符型:

如果从键盘连续输入3个字符abc, 由于ch只能容纳一个字符, 系统就把第一个字符'a赋给ch。

f.输入数据时不能规定精度, 例如:

这是不合法的, 不能企图用这样的scanf函数输入以下数据而使a的值为12345.67.

最后, 还要补充的一点就是在使用C语言库函数时, 要用预编译命令“#include”将有关的“头文件”包括到用户源文件中, 在头文件中包含了与用到的函数有关的信息。但考虑到scanf函数使用频繁, 系统允许在使用此函数时可不加#include命令。

五、(C语言)函数 第2篇

在第一章中已经介绍过,C源程序是由函数组成的, 虽然在前面各章的程序中都只有一个主函数main, 但实用程序往往由多个函数组成。函数是C源程序的基本模块, 通过对函数模块的调用实现特定的功能。C语言中的函数相当于其它高级语言的子程序。 C语言不仅提供了极为丰富的库函数(如Turbo C,MS C 都提供了三百多个库函数),还允许用户建立自己定义的函数。用户可把自己的算法编成一个个相对独立的函数模块,然后用调用的方法来使用函数。

可以说C程序的全部工作都是由各式各样的函数完成的, 所以也把C语言称为函数式语言。 由于采用了函数模块式的结构, C语言易于实现结构化程序设计。使程序的层次结构清晰,便于程序的编写、阅读、调试。

在C语言中可从不同的角度对函数分类。

1. 从函数定义的角度看,函数可分为库函数和用户定义函数两种。

(1)库函数

由C系统提供,用户无须定义, 也不必在程序中作类型说明,只需在程序前包含有该函数原型的头文件即可在程序中直接调用。在前面各章的例题中反复用到printf 、scanf 、getchar 、putchar、gets、puts、strcat等函数均属此类。

(2)用户定义函数

由用户按需要写的函数。对于用户自定义函数, 不仅要在程序中定义函数本身, 而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。

2. C语言的函数兼有其它语言中的函数和过程两种功能,从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。

(1)有返回值函数

此类函数被调用执行完后将向调用者返回一个执行结果, 称为函数返回值。如数学函数即属于此类函数。 由用户定义的这种要返回函数值的函数,必须在函数定义和函数说明中明确返回值的类型。

(2)无返回值函数

此类函数用于完成某项特定的处理任务, 执行完成后不向调用者返回函数值。这类函数类似于其它语言的过程。 由于函数无须返回值,用户在定义此类函数时可指定它的返回为“空类型”, 空类型的说明符为“void”。

3. 从主调函数和被调函数之间数据传送的角度看又可分为无参函数和有参函数两种。

(1)无参函数

函数定义、函数说明及函数调用中均不带参数。 主调函数和被调函数之间不进行参数传送。 此类函数通常用来完成一组指定的功能,可以返回或不返回函数值。

(2)有参函数

也称为带参函数。在函数定义及函数说明时都有参数, 称为形式参数(简称为形参)。在函数调用时也必须给出参数, 称为实际参数(简称为实参)。 进行函数调用时,主调函数将把实参的值传送给形参,供被调函数使用。

4. C语言提供了极为丰富的库函数, 这些库函数又可从功能角度作以下分类。

(1)字符类型分类函数

用于对字符按ASCII码分类:字母,数字,控制字符,分隔符,大小写字母等。

(2)转换函数

用于字符或字符串的转换;在字符量和各类数字量 (整型, 实型等)之间进行转换;在大、小写之间进行转换。

(3)目录路径函数

用于文件目录和路径操作。

(4)诊断函数

用于内部错误检测。

(5)图形函数

用于屏幕管理和各种图形功能,

(6)输入输出函数

用于完成输入输出功能。

(7)接口函数

用于与DOS,BIOS和硬件的接口。

(8)字符串函数

用于字符串操作和处理。

(9)内存管理函数

用于内存管理。

(10)数学函数

用于数学函数计算。

(11)日期和时间函数

用于日期,时间转换操作。

(12)进程控制函数

用于进程管理和控制。

(13)其它函数

用于其它各种功能。

以上各类函数不仅数量多,而且有的还需要硬件知识才会使用,因此要想全部掌握则需要一个较长的学习过程。 应首先掌握一些最基本、最常用的函数,再逐步深入。由于篇幅关系,本书只介绍了很少一部分库函数, 其余部分读者可根据需要查阅有关手册。

还应该指出的是,在C语言中,所有的函数定义,包括主函数main在内,都是平行的。也就是说,在一个函数的函数体内, 不能再定义另一个函数, 即不能嵌套定义。但是函数之间允许相互调用,也允许嵌套调用。习惯上把调用者称为主调函数。 函数还可以自己调用自己,称为递归调用。main 函数是主函数,它可以调用其它函数,而不允许被其它函数调用。 因此,C程序的执行总是从main函数开始, 完成对其它函数的调用后再返回到main函数,最后由main函数结束整个程序。一个C源程序必须有,也只能有一个主函数main。

函数定义的一般形式

1.无参函数的一般形式

类型说明符 函数名()

{

类型说明

语句

}

其中类型说明符和函数名称为函数头。 类型说明符指明了本函数的类型,函数的类型实际上是函数返回值的类型。 该类型说明符与第二章介绍的各种说明符相同。 函数名是由用户定义的标识符,函数名后有一个空括号,其中无参数,但括号不可少。{} 中的内容称为函数体。在函数体中也有类型说明, 这是对函数体内部所用到的变量的类型说明。在很多情况下都不要求无参函数有返回值, 此时函数类型符可以写为void。

我们可以改为一个函数定义:

void Hello()

{

printf (”Hello,world “);

}

这里,只把main改为Hello作为函数名,其余不变。Hello 函数是一个无参函数,当被其它函数调用时,输出Hello world字符串。

2.有参函数的一般形式

类型说明符 函数名(形式参数表)

型式参数类型说明

{

类型说明

语句

}

有参函数比无参函数多了两个内容,其一是形式参数表, 其二是形式参数类型说明。在形参表中给出的参数称为形式参数, 它们可以是各种类型的变量, 各参数之间用逗号间隔。在进行函数调用时,主调函数将赋予这些形式参数实际的值。 形参既然是变量,当然必须给以类型说明。例如,定义一个函数, 用于求两个数中的大数,可写为:

C语言函数 第3篇

关键词: 汇编语言; 函数调用; 指针; 引用; 堆栈

中图分类号:N 文献标志码:A 文章编号:1006-8228(2012)09-49-02

Via assemble language to catch on mechanism of value transmit, pointer transmit

and reference transmit in C/C++ function calling

Huo Shandong, Yang Xudong

(1. Chongqing three gorges university, Chongqing 404000, China; 2. Chongqing safety technology profession college)

Abstract: Since the assemble language is an important machine language of facing computer hardware directly, it can help to better understand the principle of computer. The characteristic of assemble language is introduced and it is explained in the paper how to realize value transmit, pointer transmit and reference transmit in the computer.

C语言的函数递归探析 第4篇

所谓函数递归, 是指在一个函数中有直接或间接调用函数本身。函数直接递归指函数直接在本函数中调用自身。函数间接递归指本函数调用其它函数, 其它函数又调用本函数。直接递归和间接递归图解如图1所示。

如图1所示, 递归调用可以说是一种函数循环, 程序中循环必须有中止条件, 否则就会陷入死循环。所以, 递归调用必须有中止条件, 只有递归条件满足时才调用自身, 否则 (即满足中止条件) , 函数就不再递归调用。C语言中函数递归有独特的作用。很多时候, 巧用函数递归可以解决许多看似复杂难解的问题。

2 函数递归特征

那么什么时候函数可以用递归方法呢?递归函数有何特征?本文总结了3条规则:①函数中所需要计算的数值可以通过调用自身得到, 所以递归函数必须有返回值;②函数参数值往往是有规律地递增或递减;③必须有中止条件, 一般以限定函数参数值或递归函数返回值为中止条件。

让我们先分析一下简单的递归函数:求n!

n!的数学表达式为:n!=n* (n-1) * (n-2) *……*2*1

当n=1时, 值为1

当n>1时, n!=n* (n-1) !

这个数学表达式能够满足3条规则, 求n!的函数值为n乘以 (n-1) !的函数值, 函数参数只要递减1设置即可, 另外设置中止返回值为1, 即最后一个函数的值为1 (因为1!=1) 。

该递归函数如下:

这个问题很简单明了, 不再作深入分析。再看另外一题:求∑n!

此题的数学表达式为1!+2!+……+ (n-1) !+n!

上题已经得知n!可以通过递归函数得解。而这个函数看上去也有相似规律可循。设求此题的函数为f1 (n) ;则当

显然f1 (n) 需要得到的数值包含f1 (n-1) , 且函数参为规律的递减, 函数中止条件设返回值为1。满足了3个规则, 可以用递归解决。

本函数为双层递归调用函数。通过以上例子的分析, 不难看出函数递归的优点:逻辑性强, 结构层次清晰, 可以用数学归纳法得出正确结论。

3 函数递归应用

我们在学习数据结构时, 发现递归调用经常出现在树和图的生成 (也可以说是一种排序问题) 和遍历 (特殊的查找问题) 中, 特别是在数据排序和数据查找时被频繁地使用, 充分体现了函数递归的优势和作用。

如在数据结构课程遍历二叉树和线索二叉树时, 给出的先序遍历递归函数:

在这个函数中, 对先序遍历法的顺序和结构一目了然, 同样在中序和后序遍历时, 也完全可以如法炮制应用函数递归。当然递归函数也有自身缺点, 突出缺陷是在调用自身函数时不停开辟存储空间, 在占用存储空间的同时又耗费时间, 简而言之, 大量占用资源, 运行速度相对缓慢。在小程序中使用并不会突显其缺点, 在大程序中, 要谨慎使用, 如果使用递归请考虑开辟外存空间来降低内存消耗, 同时又降低对运行速度的影响。这一部分, 由于笔者的知识结构和篇幅原因不再深入探讨。

参考文献

[1]严蔚敏, 吴伟民.数据结构 (C语言版) [M].北京:清华大学出版社, 2007.

C语言调用Lua函数 第5篇

在lua API中,调用一个函数的步骤很简单:1.压入你要调用的函数,使用lua_getglobal。2.压入调用参数。3.使用lua_pcall4.从栈中弹出结果。

举例说明,假设你有这么一个lua函数:function f (x, y)

return (x^2 * math.sin(y))/(1 - x)

end

那么,我们就可以定义个c函数来封装这个调用:/* call a function ‘f‘ defined in Lua */

double f (double x, double y) {

double z;lua_getglobal(L, ”f“); lua_pushnumber(L, x); lua_pushnumber(L, y); /* do the call (2 arguments, 1 result) */if (lua_pcall(L, 2, 1, 0) != 0) error(L, ”error running function ‘f‘: %s“,lua_tostring(L, -1));

if (!lua_isnumber(L, -1)) error(L, ”function ‘f‘ must return a number“);z = lua_tonumber(L, -1);lua_pop(L, 1); return z;}

lua_pcall在压入结果的之前,会将函数,和参数弹出,如果返回多个结果,第一个最先压入,

C语言函数 第6篇

【关键词】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语言函数教学新思路 第7篇

在C语言的教学过程中,学生们通常难以理解一些概念和程序流程的控制,比如函数和函数调用。而在C语言中,函数是一个非常重要的部分,所有程序都是由函数组成的,如果没有掌握函数,就不可能掌握C语言。关于这一问题的教学,人们也在实践中做了很多思考。但在分析C语言函数时,大部分教材都是从知识传授的层面来思考的。

1 常见问题分析

1.1 简单地罗列语法

语法知识仅仅是从语法角度系统地进行罗列,从函数形式、参数等分别进行介绍。但是仅仅这样简单的罗列语法,学生们不能深刻理解函数的意义。

1.2 语法讲解与编程实例的衔接不好

花费大量时间详细介绍函数、形参、实参等概念与语法知识,而后面的函数编程等实用知识的讲授时间不够,学生们难以接受。

1.3 模块化编程训练不够

学生对于自始至终接触到的简单编程印象比较深刻,但是模块化编程思想不够。而且,函数的教学章节在C语言教学内容的后面。因此,对于函数的调用、函数参数的传递等,学生们平时训练的强度不大。

由此可见,我们需要设计一种新的教学方案,改善C语言函数教学的效果,着重加深学生们对函数概念的理解和函数调用的掌握。

2 函数教学新思路

2.1 用EXCEL来理解函数概念

EXCEL是一个非常简单且界面友好的软件,一般在学生进入大学的第一个学期就已经学习过了。同时,由于在平时的生活、学习当中都有可能要用到EXCEL,因此学生们对于EXCEL比较熟悉。

2.2 用HTML来理解函数概念

HTML是网页设计的基础。大部分学生愿意花很多时间学习HTML,因为几乎每一个新生都想创建自己的主页。学习HTML不仅能够帮助学生掌握简单的代码编写,还能够帮助学生理解函数的概念。

2.3 根据求解目的归纳不同函数

从语法角度,通常是从参数个数和有无函数体方面将函数分为无参函数、有参函数、空函数三类。根据编写函数的目的、功能或者说用途,函数可以被分为以下三类:

(1)求值类函数:使用这种函数是为了求一个值。

求值类函数的一般定义格式:

函数值类型函数名(类型形参1,类型形参2,……)

{

根据形参的值计算所求的值;

return结果;

}

求值类函数的定义步骤是:(1)编写函数头:根据函数所求值的数据类型确定函数值类型,分析函数要提供的参数及其类型从而确定形参。(2)编写函数体:根据提供的参数(即形参),求出所需的值,最后返回(return)该值。

求值类函数在调用时通常作为表达式使用,可用于赋值、输出、运算、或作为另一个函数调用的实参。调用格式:

函数名(实参1,实参2,……)

(2)判断类函数:使用这种函数是为了检查一个判断是否成立。

判断类函数是一种特殊的求值类函数,其值为1或者0,表示判断成立与不成立。因此判断类函数值的类型固定为int。下面给出判断类函数的一种参考格式:

int函数名(类型形参1,类型形参2,……)

{

int f;/*代表判断结果*/

根据形参的值进行判断,判断成立则令f为1,否则令f为0

return f;/*将判断结果返回*/

}

判断类函数调用时通常用于在选择结构或循环结构中作为判断条件。如:

if(函数名(实参1,实参2,......)==1)......(3)操作类函数:使用这种函数是为了完成某一项操作。

操作类函数不是为了求值,即函数没有值,其函数值的数据类型是void。函数体中不能使用return(值);语句来返回一个值,但可以使用return来结束函数的运行返回到主调函数。

操作类函数一般定义格式:

void函数名(类型形参1,类型形参2,……){

根据形参的值进行处理return;/*或者无return*/}

操作类函数调用时通常单独作为语句,其调用格式:

函数名(实参1,实参2,……);

2.4 典型小案例教学

在教学过程中,尽量选择典型小案例穿插讲解。所谓的典型小案例,是指这个案例集中解释某一个概念,是一个完整的程序,但又尽可能的短小。典型小案例既有利于学生学习,也有利于老师教授。对于学生来说,典型小案例易于自学,他们能够很快地阅读程序或者修改程序,能够更好地理解程序。对于老师来说,典型小案例便于课堂讲解,能够很快修改成另一个程序,并要求学生给出对应的输出。如果学生对源代码没有充分的理解,就不能给出正确的答案。因此,典型小案例教学具有很强的启发性。

摘要:本文分析了C语言在函数学习过程中存在的问题,从概念和函数调用两个方面进行探讨,提出函数教学的新思路。

关键词:C语言,函数,新思路

参考文献

[1]王涛伟,杨秀金.C++函数的参数传递和返回值问题的教学研讨[J].吉林大学学报(信息科学版),2005,(23):70-74.

C语言函数 第8篇

在C语言的开发学习中,经常要进行内存分配,动态内存分配技术可以保证在程序运行过程中按照实际需要申请适量的内存,使用结束后释放。C语言跟内存申请相关的函数主要有alloca、calloc、malloc、free、realloc、sbrk等。在实际学习中主要通过调用库函数malloc()和free()来进行内存的分配和释放。

2 函数的基本用法

2.1 分配内存函数malloc

调用形式:(类型说明符*)malloc(size);

功能:在内存的动态存储区中分配一块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。

“类型说明符”表示把该区域用于何种数据类型。

(类型说明符*)表示把返回值强制转换为该类型指针。

“size”是一个无符号数。

例如:

表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。

2.2 释放内存空间函数free

调用形式:free(void*ptr);

功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域。

2.3 举例

分配一块区域,输入一个学生数据。

本例中,定义了结构stu,定义了stu类型指针变量ps。然后分配一块stu内存区,并把首地址赋予ps,使ps指向该区域。再以ps为指向结构的指针变量对各成员赋值,并用printf输出各成员值。最后用free函数释放ps指向的内存空间。整个程序包含了申请内存空间、使用内存空间、释放内存空间三个步骤,实现存储空间的动态分配。

3 malloc()和free()的存储机制

3.1 堆

堆是共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是用完了要还给操作系统,否则就会内存泄漏。

3.2 栈

栈是线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立。每个函数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动地切换栈,就是切换SS/ESP寄存器。

3.3 malloc()分配内存

malloc()从堆里面获得空间,也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。

3.4 free()释放内存

free()释放的是指针指向的内存。指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还存在,只不过现在指针指向的内容是无用的,未定义的。因此,释放内存后把指针指向NULL,防止指针在后面不小心又被引用。

4 结语

malloc与free是C语言的标准库函数,当使用malloc()申请了内存空间后,必须检查是否分配成功,而且malloc()和free()必须是配对使用。当不需要再使用申请的内存时,必须使用free()释放,释放后应该把指向这块内存的指针指向NULL,以免分配的空间占着不用,造成内存泄露。

参考文献

[1]徐翔.C++程序设计教学探讨[J].硅谷,2009,(02):155-156.

[2]戴春燕,徐智文.对C++中malloc/free和new/delete的探讨[J].包钢科技,2009,(01):59-60,66

[3]安晶,谢莹.C++教学探讨[J].黑龙江科技信息,2009,(03):183,99.

浅析二级C语言之函数调用的格式 第9篇

1.1 填空

1.2 改错

1.3 编程

2 上机操作解析

2.1 填空

(1) 999 (2) t/10 (3) x

2.2 改错

(1) void fun (long s, long*t) (2) while (s>0)

2.3 编程

3 知识点详析

函数调用的格式:

函数调用就是使用已经定义了的函数, 通常通过对函数的调用来执行函数体, 当函数被调用时, 函数对应的程序代码才开始执行, 才能实现相应的函数功能。其过程与其他语言的子程序调用相似。函数调用的一般形式为:

函数名 (实参列表)

实参列表中的参数可以是常数、变量或其他构造类型数据及表达式。各实际参数之间用逗号分隔。实参与形参按顺序对应, 一一传递数据。

对无参数函数调用时则无实际参数表。其格式为:

1.函数名 ()

2.圆括号“ () ”不能省略。

参考文献

[1]路瑾铭.全国计算机等级考试过关宝典系列——教程 (二级C语言) .2011 (9)

浅议C语言中函数递归调用的教学 第10篇

关键词:函数,递归调用,教学

在C语言的教学中, 函数的递归调用是教学的重点与难点。初学者对于递归调用, 往往容易陷入一个误区, 他们脑子里总是在想递归是如何实现的, 函数是如何被调用的, 又由于其调用过程太复杂而理不清头绪, 其实这给第一次接触递归调用带来了不必要的麻烦。笔者根据多年的教学经验, 整理出几个有关的知识点, 只要明白这些问题, 函数递归调用的教学与学习将迎刃而解。

一、递归条件

采用递归方法来解决问题, 必须符合以下三个条件:

1、能把要需要解决的问题转化为一个新问题, 新问题的解决方法与原来的解决方法相同, 只是所处理的对象有规律地递增或递减。

说明:解决问题的方法相同, 调用函数的参数每次不同 (有规律的递增或递减) , 如果没有规律也就不能适用递归调用。

2、用这个转化过程使问题能得到解决。

3、必定要有一个明确的结束递归的条件。

说明:一定要能够在适当的地方结束递归调用。不然可能导致系统崩溃。

二、递归函数的执行过程

递归的函数过程———执行到函数体中间再回归到自身开头的位置, 再进行。可以借助栈来解释其执行过程, 下面用求阶乘的例子来说明:

假设这里执行Factorial (4) , 那么程序会按照下面方式来执行:

1、执行Factorial (4) 判断n>1执行Factorial (3) , 并且将Fac-torial (4) 函数相关信息存入一个栈.

2、执行Factorial (3) 判断n>1执行Factorial (2) , 并且将Fac-torial (3) 函数相关信息存入一个栈.

3、执行Factorial (2) 判断n>1执行Factorial (1) , 并且将Fac-torial (2) 函数相关信息存入一个栈.

4、执行Factorial (1) 判断n==1执行返回1;

5、将Factorial (2) 函数从栈中取出, 执行2*1, 并且返回2.

6、将Factorial (3) 函数从栈中取出, 执行2*3, 并且返回6.

7、将Factorial (4) 函数从栈中取出, 执行6*4, 并且返回24.

如下图所示:

三、递归函数的参数

当函数自己调用自己时, 系统自动把函数中当前的变量和形参暂时保留起来, 在新一轮的调用过程中, 系统为新调用的函数所用到的变量和形参开辟另外的存储单元 (内存空间) 。每次调用函数所使用的变量在不同的内存空间。即系统每次调用该函数使用的函数参数不同, 且保存在不同的存储空间。如上例, 第一次调用时函数参数为4, 以后依次减1。

四、递归转非递归

任何“递归函数”都可以通过程序员自己控制系统转为“非递归程序”实现。一般采用循环方法实现:循环方法是所有递归到非递归的转换中最理想的方法, 可以将开销减少到最小。

不过分析起来很复杂, 对于简单的递归可以用这样的方法来处理.

例如:求Fibonaccio数列问题

首先用递归形式表示如下:

转为非递归函数分析如下:

这里回到Fibonaccio数列定义上面来分析, 这里将第n项的值的数学公式分析为n=1或者n=2时值为1, 当n>2时第n项则为第n-1和n-2的数据之和。

这样就可以很容易得到另外一个定义:

求Fibonaccio数列第n项的值则表示执行n-2次循环计算一个增量f, 初始i=3和结果f=0;每次f值为前两项数值的和。

因为函数递归时需要不断的在内存中保存/恢复现场, 这将大大增加系统的开销, 所以在选择递归结构进行程序设计时, 要考虑到“可理解性和效率”之间的关系。

只要讲清楚以上四个知识点, 函数的递归调用教学就不再困难, 学生学习也容易理解了, 而且扩展了学生的学习思路, 增加了学生学习C语言的兴趣, 可以达到较好的教学效果。

参考文献

[1]《C程序设计》 (第二版) 谭浩强主编清华大学出版社。

C语言中函数参数传递教学模式探讨 第11篇

函数参数传递内容是C语言教学中的重点和难点,所以很多教材都详细论述了实参和形参的概念及区别,并将参数传递方式分为值传递和地址传递两种,还详细阐述了数组名、指针作为函数参数等内容。这使得对参数传递这一知识点的介绍较多且分布不均,内容之间的规律性和衔接性不强,学生不易掌握。调查发现,不少学生对参数的传递方式感到困惑,欠缺分析解决问题的能力,这在一定程度上挫伤了他们的学习信心和积极性。为了更好地提升教学效率,笔者在多年教学经验的基础上,探讨了函数传递教学形式和方法,以供参考。

●打牢前期课程内容基础,强化对相关知识点的介绍

众所周知,C语言的教学内容是循序渐进的,只有打下良好的前期基础,才能更深入地学习后续章节内容。为了使学生深刻理解参数传递的内容,教师应在课堂上强调相关知识点。

首先是变量的概念。它是对内存数据空间的抽象,有值和地址两种属性,要让学生注意区分,这是参数传递和指针学习的基础。

其次是对数组名的理解。调查发现,当编程题中涉及将数组名作为函数参数时,很多学生都会犯同样的错误,如将数组int a[10]作为实参数组,调用函数int average(int s[10],int n)时,学生经常将该函数调用写成avegage(a[10],10)。由于学生对数组名的含义没有深入了解,所以教师在讲解数组时,应和学生强调数组名是地址,代表数组首地址,这样便于开展后续教学内容。

再次是函数一章的知识点,具体包括函数定义、返回值、函数说明、函数调用、函数参数等概念。由于知识点之间贯穿的脉络不甚清晰,课堂讲解时较为枯燥,所以可结合案例式和互动式教学法,让学生在课堂上讲一遍、动手写一遍,以加深对这些知识点的理解,深刻领会其在实际中的应用。

最后是指针的概念。由于它是C语言的难点,所以在课堂讲解中应适当放慢教学节奏,向学生重点明确指针变量的概念、指针变量和普通变量的区别、*和&运算的含义、变量的间接访问、指向数组元素的指针变量的概念、指针运算的含义、指针变量对数组元素的引用(指针法)等内容,这是后面各种类型的指针变量作为函数参数学习内容的基础。在此基础上讲解数组作为函数参数传递的本质,往往能收到好的效果。

●牢记参数传递的特点,画出内存变量分布示意图

很多教材将参数的传递归纳为值传递和地址传递两种,并论述两者区别,还指明了地址传递的方式和特点,即函数调用时,将数据的存储地址作为参数传递给形参,形参与实参占用同样的存储单元,进行的是双向传递。这样的总结固然很好,但学生不易掌握。在笔者看来,参数传递的两种划分是没有必要的,可以将所有的参数传递都看作是值传递,并将参数传递的特点概括为:(1)函数调用前,形参不占用内存单元;(2)函数调用时,才给形参分配内存单元,且将实参的值传递给形参;(3)函数调用结束后,形参占用的内存单元自动释放。

为了培养学生的画图习惯,在函数的教学中应不断强调画出变量在内存中的分布示意图,这样能清晰无误地分析结果,有利于学生对知识点的深刻理解和熟练运用。如图1、图2的例题,学生往往将结果错误地认为是9、5,并反复提问。

类似问题的讲解如果将形参的特点以内存的动态分布图画出,学生能很容易理解,也能收到事半功倍的教学效果,上述例题的内存动态分布图可画为如图3所示的形式。

很多教材还将“数组作为函数参数”列为函数一章的一节,并指明了相关注意事项,如形参数组可以不指定大小,共同占用存储单元等,其实这部分内容可以安排到“指针”一章中专门介绍,也可以在讲解数组作为函数参数传递时,简要说明下实参用的是数组名,是数组首地址,形参在形式上虽是数组,却是指针变量,即形参数组int x[10]等价于int*x,所以形参数组可以不指定大小。并强调这也是特殊的值传递,传递给形参的“值”是地址,完全符合值传递的三大特点。由于之前没有学习过指针内容,所以学生可以在记忆的基础上去学习,并牢记这一特点,即参数用数组、实现数组和形参数组是同一数组。再结合例题(如图4、图5)进行学习时,学生就很容易理解了,这在无形中也激发了学生的探索欲望。

●掌握指针变量的运用,理解数组名作为形参的本质

在进入到指针内容的学习时,当该指针变量指向的是一般变量,并作为函数参数时,需指明实参和形参类型要保持一致,是将实参变量的地址作为“值”传递给形参变量,再将值传递的三大特点和内存中变量的动态分布图相结合。

由于前期只是让学生记住了实参数组和形参数组是同一数组,学生并没有掌握其原理。当介绍指向数组元素的指针变量作为函数参数时,应和函数一节中的数组名作为参数的内容相衔接合并介绍。很多教材将参数的传递方式总结为如下页表所示的对应情况。

虽然形式上只有四种,但看起来仍较复杂。此时,如果通过四个不同的案例,明确被调用函数是对数组元素的不同引用,则能让学生深刻明白四种形式的实质都是一样的,都强调形参数组的本质是指向数组元素的指针变量,所以数组的大小可以不指定,都是通过这一变量来引用数组元素。实参到形参的传递是值的传递,符合值传递的特点,形参指针变量在函数调用结束后会释放。

●结语

为了提升教学效率,笔者根据多年的教学经验以及学生的反馈情况,对函数传递这一教学内容进行了优化整合,设定了层次化的教学模式。该模式从重视学生的基础概念入手,概括出参数传递的特点,要求学生画出内存变量的动态分布图去详细分析函数传递的过程,引导学生理解数组名作为函数参数的本质,从而达到学生在课堂上能听懂,课后会熟练应用的目的,提升了学生的学习信心和学习兴趣。由于指针变量类型丰富,包括指向函数的指针、指向数组的指针、指向指针的指针等,它们都可以用来作为函数参数,其传递过程都符合值传递的特点,都是通过形参指针变量来对指向的目标进行处理,所以本文不再细述。

摘要:C语言函数参数传递内容是教学的重难点,学生在分析解决该类问题时的困惑较多。因此,为了提升教学效率,笔者提出了一套针对函数参数传递的教学模式。该模式要求学生深化对相关知识点的理解掌握,在讲解参数传递过程时将参数传递特点和内存变量分布示意图联系起来,最后结合指针的教学探讨数组名作为函数参数的本质。

关键词:函数参数传递,教学模式,参数传递特点

参考文献

[1]谭浩强.C程序设计[M].北京:清华大学出版社(第四版),2010.

本文来自 99学术网(www.99xueshu.com),转载请保留网址和出处

【C语言函数】相关文章:

C语言函数分析论文12-29

php语言基础之函数05-16

调用C函数05-07

学好C语言09-06

C语言学习05-22

C编程语言08-07

C语言指针教学08-20

类C教学语言09-01

c语言论文提纲09-30

期末复习c语言07-26

上一篇:道桥施工技术要点控制下一篇:噪声引起听力损伤