有關C 結構體定義和傳參的一些問題

2022-09-10 03:36:10 字數 1182 閱讀 3621

在做廣義表的題目時,在結構體的定義和傳參上出了一些問題,導致後續廣義表的實現上出錯,然後用了乙個下午修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...