怎么理解 C 语言中的值传递和址传递?

2016-06-11 19:41:24 +08:00
 brooky

怎么理解值传递和址传递? 完全蒙圈了,不要告诉我这是规定.

1902 次点击
所在节点    问与答
11 条回复
bazingaterry
2016-06-11 19:58:54 +08:00
就像小明要抄你的作业,值传递就是你给小明看,然后它按着抄了一份一模一样的;址传递就是你小明直接把你的拿去用了……
lizhenda
2016-06-11 19:59:48 +08:00
这有什么不好理解的呢?初学者吗,如果是的话还是先不去专牛角尖想,多写自然就会理解了。
congeec
2016-06-11 20:01:31 +08:00
既然提到了规定,你去看 specification 呀
C 语言只能传值。地址是啥?指针是啥?不就是一数字么,一个记录数据地址的数字。比如:
void free(void *ptr);
这里面传过去的 ptr 就是一个 0x11223344 这样的值。
starcraft
2016-06-11 20:10:30 +08:00
看编译器的实现代码啊 配合 gdb 包治各种初学者疑难杂症。
gdtv
2016-06-11 20:21:53 +08:00
值传递就是把你的作业拿去复印一份,然后别人怎么用你的复印件对和无关对你无影响。
地址传递就是别人直接把你的作业拿走了,别人可以只看看然后还给你,也可以改了你的作业再还给你。
eamars
2016-06-11 20:27:12 +08:00
rule of thumb:
如果是函数的输入 parameter , int , float , char 这种自带类型,可以使用值传递和地址传递,对于 struct 这种,只能使用地址传递。这些都是效率决定的。

如果是函数的输出 parameter ,只能使用地址传递。

比如:

typedef struct
{
int x; int y; int z;
} Vector_t;

void callback_function(int input_a, Vector_t *input_b, int *output_a, Vector_t *output_b)

这样的
acros
2016-06-11 20:36:32 +08:00
初学者还是要简单的方法去理解,说太底层了不太好吧。

举个例子,你要查字典里面一个字的解释。
值传递就是你把查到的内容重新抄写下来了。
址传递是把查到的页面位置记下来,需要时再去这个已经记住的地方找。
aheadlead
2016-06-11 20:58:47 +08:00
@starcraft 大哥给跪 读编译器代码指条路吧
powergx
2016-06-11 21:03:46 +08:00
上网用域名访问 vs 背 ip
xuwenmang
2016-06-11 21:05:39 +08:00
你要学 C#可能混乱。

有 4 个概念
值类型、引用类型
值参数、引用参数

混合下各种效果有:
值类型的值传递、
值类型的引用传递
引用类型的值传递
引用类型的引用传递

当时看的时候瞬间蒙逼。不过 C#有本初级好书叫 C#图解,两三页,几个图片,看完瞬间开朗。
billlee
2016-06-11 23:44:41 +08:00
去看微机原理

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/284956

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX