在做廣義表的題目時,在結構體的定義和傳參上出了一些問題,導致後續廣義表的實現上出錯,然後用了乙個下午修bug。在此記錄一下收穫。
使用typedef定義
typedef struct glnode
ptr;
};}*glist;
glist a; //a是乙個指標!
這種寫法可以理解為給結構體取了乙個別名。(資料結構書上基本都是這樣使用的)
在這裡,我們給結構體glnode取了乙個別名:「glist」,前面加*的意思是建立出來的東西是指標,不過我覺得這種寫法很奇怪就是了,而且它還能做到一些struct做不到的事情(伏筆)。
使用struct定義
struct glnode
ptr;
};}*a;
建立出來的結構體名字就是glnode,同時定義了乙個a指標。
struct abc
*a;void dos(abc *x)
int main()
這個程式的輸出為12。簡單解釋的話就是彷彿把指標傳了進去,但實則沒傳。具體原因如下:
1.把指標a所指的地方賦給指標x
2.分配記憶體空間並讓x指向其位址
發現沒,我們把a所指向的位址給了x,之後x又獲得了開闢空間後的新位址,也就覆蓋了a所指的位址,所以相當於根本沒把a傳入函式。
所以想要達到傳入的目的,就只能使用引用傳參了(這句話不完全對,看最後一句話)(話說個人感覺引用傳參是唯一一種真正把引數傳入函式的方法欸)
這個時候新的問題就出現了:引用傳遞好像傳遞不了指標...總不能abc &*a這麼寫吧
但也不是完全傳不了,這時候就要請typedef出場了(伏筆**)
typedef struct abc
*newabc;
newabc a;
void dos(newabc &x)
int main()
這個程式的輸出就是11了。當我們使用newabc進行取別名之後,指標a便能很輕鬆的被引用傳遞了,因此也就真正的把指標a傳入了函式從而實現了效果。
理論上來說感覺利用指標傳參把指標a的位址傳入函式也能達到這個效果,但是我寫就會報錯,所以也算是乙個遺留問題吧。
結構體的傳參使用 定義
在函式體中使用結構體 我們應該知道將結構體傳遞給函式有三種方式 傳遞結構體的個別成員。傳遞整個結構體。傳遞乙個指向結構體的指標。當結構體或者結構體的個別成員被傳遞給乙個函式時,它們是按值傳遞的。因此,主調函式中的結構體成員不會被被調函式所修改。按引用來傳遞乙個結構體,實際上是將結構體變數的位址傳遞過...
有關結構體的一些題目
1 設有下面的結構體和結構變數定義 struct student 關於結構體型別變數賦值正確的是 a studl.id 1001 studl.name tom b id 1001 studl.name tom c studl.id 1001 studl.name tom d studl.id 100...
有關c 傳引用和結構體模板問題
1.分數 include using namespace std struct feng void disp feng f void input feng f intmain 輸出結果很顯然錯誤 其實在ji輸入的時候f是拿他的副本進行計算,只要在f前面加乙個 問題就輕鬆解決了 include usi...