怎么理解 C 语言中的值传递和址传递? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
brooky
V2EX    问与答

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

  •  
  •   brooky 2016-06-11 19:41:24 +08:00 2292 次点击
    这是一个创建于 3439 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    11 条回复    2016-06-11 23:44:41 +08:00
    bazingaterry
        1
    bazingaterry  
       2016-06-11 19:58:54 +08:00
    就像小明要抄你的作业,值传递就是你给小明看,然后它按着抄了一份一模一样的;址传递就是你小明直接把你的拿去用了……
    lizhenda
        2
    lizhenda  
       2016-06-11 19:59:48 +08:00
    这有什么不好理解的呢?初学者吗,如果是的话还是先不去专牛角尖想,多写自然就会理解了。
    congeec
        3
    congeec  
       2016-06-11 20:01:31 +08:00   1
    既然提到了规定,你去看 specification 呀
    C 语言只能传值。地址是啥?指针是啥?不就是一数字么,一个记录数据地址的数字。比如:
    void free(void *ptr);
    这里面传过去的 ptr 就是一个 0x11223344 这样的值。
    starcraft
        4
    starcraft  
       2016-06-11 20:10:30 +08:00 via iPhone
    看编译器的实现代码啊 配合 gdb 包治各种初学者疑难杂症。
    gdtv
        5
    gdtv  
       2016-06-11 20:21:53 +08:00   1
    值传递就是把你的作业拿去复印一份,然后别人怎么用你的复印件对和无关对你无影响。
    地址传递就是别人直接把你的作业拿走了,别人可以只看看然后还给你,也可以改了你的作业再还给你。
    eamars
        6
    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
        7
    acros  
       2016-06-11 20:36:32 +08:00
    初学者还是要简单的方法去理解,说太底层了不太好吧。

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

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

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

    当时看的时候瞬间蒙逼。不过 C#有本初级好书叫 C#图解,两三页,几个图片,看完瞬间开朗。
    billlee
        11
    billlee  
       2016-06-11 23:44:41 +08:00
    去看微机原理
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1463 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 16:42 PVG 00:42 LAX 08:42 JFK 11:42
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86