| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2743 人关注过本帖
标题:深入讨论传值和传址
只看楼主 加入收藏
大水牛
Rank: 1
等 级:新手上路
威 望:1
帖 子:233
专家分:0
注 册:2005-11-21
收藏
 问题点数:0 回复次数:15 
深入讨论传值和传址
在C和C++中我们一直使用两种比较传统的形参传递方式,一种是传值一种是传址,对于他们,我们的理解是:传值调用的话,传的是内容,形参的改变不会影响实参,传址的话形参的改变会影响实参。究其原因的话:传址是形参和实参共用一个地址内存。
但是,大家对到底怎么一回事还是没有很明白,我们今天就来好好探讨一下这个问题。
说到这,不得不提一个概念,那就是堆栈,堆栈也是个和内存打交道的名词,请允许我这么表达```
堆栈也是在内存中开辟一个空间,但是呢,它很有脾气,存放东西有个特殊的规矩,那就是先来的先放下,按顺序放进后来的数据,要出去呢,必须得等后面的人都走了,第一个数据才能出去,这个很像火车的调头作业。
总得概括堆栈,用4个E文字母,那就是FILO——first in list out
现在大家对堆栈有一定概念了,我们接着讨论传值,址问题
在函数调用的时候其实在物理结构中,到底发生了什么呢,为什么调用完我们还能继续主函数呢,主函数数据为什么会保留住呢,形参为什么会消失了呢,大家有考虑过吗?
原理其实是这样的,在函数调用的时候,在运行的内存中机器开辟了一个堆栈(DIS-PLAY表),它先存放了主函数在调用时指令的入口地址,以便最后调用结束继续执行,那么形参的问题呢,很明显,个中学问也就在堆栈中了```因为调用过程在堆栈中完成。
传值调用的情况是这样的:实参把值压入堆栈然后就发生传递过程了,形参接受这个值,也可以改变这个值,形参可以在自身的函数中有很多变量,可以进行运算,改变他们的值,但问题的关键是,这些变量开辟的内存空间都是在堆栈中的,在调用结束的一瞬间堆栈全都释放弹栈了,所有的堆栈的内存空间都没了,存放的数据也就跟着消失了。这个就是传值不影响实参的根本原因。
那么再说说为什么传址会影响呢?
它其实和传值基本一样的传送过程,但是关键就在于在刚开辟堆栈的时候,它放入的不是实参的值而是地址,那么形参在修改的时候,修改的就是实参地址所对应的值,也就是实参的值,虽然随着堆栈的消失,这个实参地址和形参都消失了,但修改的内容却不在堆栈所开辟的内存中,它一直存在着,而且这个内存就是原来用来存放实参的。
这个就是为什么它能影响实参的原因
由于写的比较仓促,有点混乱,希望大家能谅解。有什么不明白的,大家可以在讨论一下,因为放假了,所以我会长在线,和大家一起讨论的,希望大家共同进步!
搜索更多相关主题的帖子: 传址 传值 堆栈 内存 
2006-07-30 23:59
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 
[QUOTE]究其原因的话:传址是形参和实参共用一个地址内存。[/QUOTE]

C中的传址(*) 并不是单纯的是形参和实参公用一段地址

而是实参为地址.而形参为指针.指向这段地址,我们只能说是利用了指针以其达到改变实参的目的

如果说真的传址,我还是认为是C++中的引用(&)

[此贴子已经被作者于2006-7-31 8:15:44编辑过]


[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-07-31 08:15
ccjamting
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2006-7-10
收藏
得分:0 
楼主说得很好,楼上也作了补充。
楼主分析了实参和形参的转化过程也就是调用过程,很详细,给我很大的帮助。
楼上为楼主补充说明,很到位。
确实在C中指针很灵活,不只是共享内存地址这样简单,他起着指向,修改等一系列作用。
而在实参和形参的转化中确实可以理解为传址是形参和实参共用一个地址内存。

即非出自名门,又系旁门左道,我,就这样笑着。
2006-07-31 09:30
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-08-01 10:33
论坛
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1372
专家分:0
注 册:2006-3-27
收藏
得分:0 
he he ........

日出东方,唯我不败! 做任何东西都是耐得住寂寞,任何一个行业要有十年以上的积累才能成为专家
2006-08-01 10:56
论坛
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1372
专家分:0
注 册:2006-3-27
收藏
得分:0 
说到这,不得不提一个概念,那就是堆栈,堆栈也是个和内存打交道的名词,请允许我这么表达```


===============

heap is heap,
stack is stack,
heap != stack.



日出东方,唯我不败! 做任何东西都是耐得住寂寞,任何一个行业要有十年以上的积累才能成为专家
2006-08-01 11:00
大水牛
Rank: 1
等 级:新手上路
威 望:1
帖 子:233
专家分:0
注 册:2005-11-21
收藏
得分:0 
以下是引用穆扬在2006-8-1 10:33:51的发言:
几筐废话

c里面只有传值,如此而已
那请你以后别用指针,谢谢,你不如去VB?那比较适合你!
一句傻话````````只有传值!!!!!!!!!

虽然现在的我什么都不明白,但总有一天,我将包容一切,让优秀变成一种习惯。。。。。。。。。。。。
2006-08-01 11:03
论坛
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1372
专家分:0
注 册:2006-3-27
收藏
得分:0 
穆扬 shuo de mei cuo

日出东方,唯我不败! 做任何东西都是耐得住寂寞,任何一个行业要有十年以上的积累才能成为专家
2006-08-01 11:07
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-08-01 11:26
大水牛
Rank: 1
等 级:新手上路
威 望:1
帖 子:233
专家分:0
注 册:2005-11-21
收藏
得分:0 

我不否认有堆和栈分开的概念问题,但是不知道楼上的知道堆栈为一个词的在特定场合的含义吗?
另外我说FILO的特点是堆的特点,(FIFO是栈的特点)补充一下。


虽然现在的我什么都不明白,但总有一天,我将包容一切,让优秀变成一种习惯。。。。。。。。。。。。
2006-08-01 18:12
快速回复:深入讨论传值和传址
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017922 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved