深入剖析C函数的参数传递机制

深入剖析C函数的参数传递机制

ID:44304608

大小:195.50 KB

页数:9页

时间:2019-10-20

深入剖析C函数的参数传递机制_第1页
深入剖析C函数的参数传递机制_第2页
深入剖析C函数的参数传递机制_第3页
深入剖析C函数的参数传递机制_第4页
深入剖析C函数的参数传递机制_第5页
资源描述:

《深入剖析C函数的参数传递机制》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、M深入剖析C/C++函数的参数传递机制首先,这篇文章针对近期网友在ARX版块的提问,很多都是在调用ARX函数或者设计自定义函数时出现的怵1惑,为方便人家分析和理解问题,进而正确解决问题,我将个人的一些理解写成文字,希望对人家在做ARX程序设计时有所帮助。同时,这篇文章也为“ObjeclARX程序设计入门(2)”作些准备工作。这篇文章与普通的C/C++教材相比,可能要深入得多,阅读时应该细心。而对于未接触过C语言的读者来说,大概需要先阅读一般的C++教材。我的看法,《C++编程思想》和《深入浅出MFC》一类的书对于初学者太过深入,而类似《VisualC++6.0从入

2、门到精通》的书籍主要篇幅在介绍VC软件的使用方法而不是讲解C卄程序设计方法,它们都不适宜作C卄或ARX程序设计入门学习用书。我个人学习C++使用的是南京大学出版社的书名就是《C++教程》,它是为C程序员编写的C++教材,全书仅130多页,内容浅显但基本够用。不过那是上I比纪90年代初岀版的,现在大概不好找了,不过类似的(比如说大学教材)我想书店里还是有的。文章屮的大部分内容是我个人的看法,一般的C++书籍上找不到类似的说法与其比较,对于其正确性,我没冇十足的把握。各位网友可以对此进行讨论或者批评。(只是不婆真的用砖头砸,那样对于我英勇而忙碌的医护人员太不尊重,别再

3、给他们添乱了。)C语言的函数入口参数,可以使用值传递和指针传递方式,C++乂多了引JlJ(reference)传递方式。引用传递方式在使用上类似于值传递,而其传递的性质又象是指针传递,这是C++初学者经常感到困惑的。为深入介绍这三种参数传递方式,我们先把话题扯远些:1、C/C++两数调用机制及值传递:在结构化程序设计方法中,先辈们告诉我们,采用"自顶向下,逐步细化”的方法将一个现实的复杂问题分成多个简单的问题来解决。而细化到了最底层,就是“实现单一功能”的模块,在C/C++中,这个最小的单元模块就是函数。然而,这些单个的模块(或者说函数)组合起來要能完成一项复杂的

4、功能,这就注定各个函数Z间必然要冇这样或那样的联系(即耦介)。而参数耦介是各个函数Z间最为常见的耦合方式,也就是说,各个两数Z间通常通过参数传递的方式來实现通讯。当我们设计或者调用一个函数时,首先要注意的是两数的接口,也就是函数的参数和返回值。调用一个函数就是将符合函数接口耍求的参数传递给函数体,函数执行后返回一个值给调川者。(当然,C/C++允许void类世的参数和返冋值。当返冋值为void时,函数类似Basic的Sub子过程或者Pascal的Procedure过程。)函数的参数传递,就是将在函数体外部己赋值(或者至少己经定义并初始化)的变量通过函数接口传递到函

5、数体内部。根据变量种类的不同,冇不同的参数传递方式:若传递的参数是一个类对彖(包括彖Int和float这样的C/C++内部数据类型),这种传递方式为值传递。C/C++这种以函数为主体的语言中,儿乎所有的功能都是通过函数调用来实现的。v不是吗?你说C/C++运算符操作?还有变量声明?你先等等,接下來我们就看看C++屮这些操作是怎么实现的。〉以下的C/C++代码是如此的简单,可能你从未想过还有什么要分析的,但它确实是函数值传递方式的典型例子。floatx=0.254;floaty=3.1415;floatz=x+y;以上代码编译执行时,第一步floatx,即声明一个实

6、数变最。即将标志符x认为是一个实数变量,并调用flet类的初始化函数。当然你可能感觉不到它的存在,因为现在的CPU都直接支持浮点运算,它只是一条汇编指令而已。初始化完成厉,调用赋值两数:x.operator=(0.254);不要奇怪以上函数的写法,它实际上与x=0.254;效果完全相同,会产生同样的汇编代码。该函数首先根据变量x的数据类型分配介适的内存空间,并将该内存地址与标志符x关联。然后将立即数0.254写入分配的内存。(这里借用汇编语言的术语,立即数可以理解为程序已指定的具体数值。)然而,赋值函数的设计者并不能获対立即数0.254的数值,调川该函数时就必须通

7、过参数传递的方法将数值通知给函数体。赋值函数接口大致是这样:floatfloat::opcrator=(registerfloata);变量"是在CPU寄存器中使用的临时变量。调用赋值两数时,将0.254送到寄存器变量a屮,再将a值送到变量x所在的内存位置中。以上*1数的返回值用于类似这样的链式表达式的实现:x=y=z;说了许多,好象十分复杂,其实赋值操作仅仅只是两条汇编代码:movAX,0.254mov[x],AX事实上,它Z所以简单,仅仅是因为flOJH是CPU能直接处理的数据类型。若以上代码中不是fkxn类型数据赋值,而是更复杂的(比如说口定义)类塑数据,同

8、样的赋值操

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。