Re: [問題] 新手C語言的call by address不太會使用

看板C_and_CPP作者 (瓶子)時間16年前 (2010/02/28 19:51), 編輯推噓4(4012)
留言16則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《mqazz1 (無法顯示)》之銘言: : 以下是我的程式碼 : #include <stdio.h> : #include <stdlib.h> : int val(int a, int b); : int add(int *a, int *b); : int main(void) : { : int a=5, b=10; : int *c, *d; //------------------------------------ : c = malloc(sizeof(int)); (1) : d = malloc(sizeof(int)); (2) : c = &a; : d = &b; (1)、(2)刪掉吧 浪費記憶體了 //------------------------------------ : printf(" a = %d\n b = %d\n*c = %d\n*d = %d\n\n", a, b, *c, *d); : val(a, b); : printf(" a = %d\n b = %d\n", a, b); : add(c, d); // 非 add(&c, &d); add(c,d) call by vaule. add(&a,&b) 才正確 : printf("*c = %d\n*d = %d\n", *c, *d); : system("pause"); : return 0; : } : int val(int a, int b) : { : printf("=====call by value====\n"); : a = 100; : b = 200; : printf(" a = %d\n b = %d\n", a, b); : printf("=====return=====\n"); // return ?? : } : int add(int *c, int *d) : { : printf("\n\n\n"); : printf("=====call by reference=====\n"); : *c = 100; : *d = 200; : printf("*c = %d\n*d = %d\n", *c, *d); : printf("=====return====\n"); // return ?? : } : 他介紹的是傳&x,用int *n接收, : 那我寫的傳add(&c, &d),用int add(int *c, int *d)接收, : 為什麼會不行呢? 他的是 int x,你的是int *c; : 要用add(c, d)才不會失敗.... : 請問是怎麼回事呢? : 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.227.180.21

02/28 19:55, , 1F
add 要的是兩個整數變數的位址, 因為你用指標去接參數
02/28 19:55, 1F

02/28 19:56, , 2F
如果給它 &c、&d, 語意上就是「給他兩個指標變數的位
02/28 19:56, 2F

02/28 19:57, , 3F
址」
02/28 19:57, 3F

02/28 20:47, , 6F
參考一下上列超連結
02/28 20:47, 6F

02/28 23:19, , 7F
樓上, 那個網站教的就是典型被誤解的概念....
02/28 23:19, 7F

02/28 23:20, , 8F
建議看一下精華區: z->3->7->9, 有對pass by value與
02/28 23:20, 8F

02/28 23:21, , 9F
pass by reference做解釋, 順便解釋了容易被錯誤引用
02/28 23:21, 9F

02/28 23:21, , 10F
的pass by address - 這個C語言不存在的機制....:)
02/28 23:21, 10F

03/01 01:01, , 11F
謝 v 大, 看來要學的不少..
03/01 01:01, 11F

03/01 01:12, , 12F
再請問, blog 中所提及的變數值與位址變化是否有誤?
03/01 01:12, 12F

03/01 02:40, , 13F
應該是對的, 撇除by address這個錯誤的名詞以外, 他的實
03/01 02:40, 13F

03/01 02:41, , 14F
例與圖說運作都是對的:)
03/01 02:41, 14F

03/01 02:44, , 15F
#1A5iL3A- 小弟在這篇的上半也寫過了純文字的解釋,
03/01 02:44, 15F

03/01 02:44, , 16F
不怕腦筋打結的話就....XD
03/01 02:44, 16F
文章代碼(AID): #1BYbYihO (C_and_CPP)
文章代碼(AID): #1BYbYihO (C_and_CPP)