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

看板C_and_CPP作者 (無法顯示)時間16年前 (2010/02/28 19:34), 編輯推噓6(607)
留言13則, 5人參與, 最新討論串1/2 (看更多)
以下是我的程式碼 #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)); d = malloc(sizeof(int)); c = &a; d = &b; 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); 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"); } 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"); } 我的問題在於 main裡呼叫add( )時, 實際參數要用add(c, d); 但是用add(&c, &d);就會有錯誤 因為我看這個網站 http://caterpillar.onlyfun.net/Gossip/CGossip/ArgReturn.html int main(void) { int x = 10; .... printf("%d\n", increment(&x)); printf("%d\n", x); return 0; } int increment(int *n) { *n = *n + 1; return *n; } 他介紹的是傳&x,用int *n接收, 那我寫的傳add(&c, &d),用int add(int *c, int *d)接收, 為什麼會不行呢? 要用add(c, d)才不會失敗.... 請問是怎麼回事呢? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.166.118.191

02/28 19:40, , 1F
C 只有 call by value ... kekeke...
02/28 19:40, 1F

02/28 19:42, , 2F
注意一下「指標」, 指標會了 你就懂了
02/28 19:42, 2F

02/28 21:09, , 3F
c和d原本就是指標這樣嗎
02/28 21:09, 3F

02/28 23:27, , 4F
c和d原本就宣告為指標嚕~~所以本身就代表位址了
02/28 23:27, 4F

02/28 23:27, , 5F
你再加上&變成對一個位址取址?應該是不能這樣寫...
02/28 23:27, 5F

02/28 23:40, , 6F
樓上, &是對變數取址, 所以自然也可以對指標變數取址;
02/28 23:40, 6F

02/28 23:40, , 7F
對c, d取址的合法的, 只是在這邊不match原po的需求, 而
02/28 23:40, 7F

02/28 23:41, , 8F
且因為型態不match, 所以compile也不會過:)
02/28 23:41, 8F

02/28 23:42, , 9F
順便給原po, 不要只看&或*, 你要明確知道你的函數傳入的
02/28 23:42, 9F

02/28 23:43, , 10F
型態需要什麼, 然後在call函數時給它正確的型態:)
02/28 23:43, 10F

03/01 09:16, , 11F
可以問一下嗎? 我用gcc compile為什麼都過了而且都正確?
03/01 09:16, 11F

03/01 10:02, , 12F
他貼上來的程式本來就沒有compile error, 也可以正常執
03/01 10:02, 12F

03/01 10:02, , 13F
行, 除了浪費了兩個malloc來的int空間以外....@_@"
03/01 10:02, 13F
文章代碼(AID): #1BYbJXok (C_and_CPP)
文章代碼(AID): #1BYbJXok (C_and_CPP)