回覆列表
-
1 # IT劉小虎
-
2 # 光明右使8787
看應用場景,像微控制器開發是不需要用結構體的,定義幾個簡單的變數就能解決。如果是網路通訊開發,不用結構體,自己去填充char陣列,那是要吐血的。比如IP頭,就是一個結構,收到報文,用IP頭結構體一指,就能輕易取出各個欄位。要不然只能按段長度一段一段解析。
看應用場景,像微控制器開發是不需要用結構體的,定義幾個簡單的變數就能解決。如果是網路通訊開發,不用結構體,自己去填充char陣列,那是要吐血的。比如IP頭,就是一個結構,收到報文,用IP頭結構體一指,就能輕易取出各個欄位。要不然只能按段長度一段一段解析。
C語言的結構體是非常重要的語法,畢竟當初祖師爺發明C語言的其中一個首要任務就是要能提供資料的結構化。題主覺得結構體難,估計是因為初學C語言的緣故。
還記得剛開始接觸 C 語言的時候,為了描述一個平行四邊形的邊長和對角線長,我定義了四個變數:短邊長 a,長邊長 b,對角線1長 d1,對角線2長 d2。
在寫程式碼的過程中,發現又要定義一個平行四邊形,於是我不得不又定義了四個變數:a2,b2,d12,d22,結果變數又多又亂,寫程式碼很不舒服,太容易弄混了。當時我還想,幸好沒有第三個,第四個平行四邊形。
後來,我發現原來 C語言原來還有結構體這種語法,不禁感嘆當初我那種做法實在是太笨了。
C語言中的結構體(複合資料型別)C語言初學者最先接觸到的資料型別大多都只具有單一的值,例如整數,字元,真假值,小數,在C語言中(或者說程式語言中)這些資料型別通常被稱作基本資料型別。
事實上,C語言中還有複合資料型別,那什麼是複合資料型別呢?實際上,你可能已經用過複合資料型別了:由許多字元組成的字串,就是典型的符合資料型別。
用 C 語言制定一個描述平行四邊形邊長和對角線長的結構體資料型別。
這個需求是容易實現的,我們用 double 型別來描述“長度”,那麼結構體可以如下定義:
要注意的是,結構體定義完後,大括號後面要用 “;”結束。parallelogram 並不表示一個變數,它表示一種複合資料型別,struct parallelogram{ double a, b, d1, d2; } 整體可以看做一個就像 int,double 一樣的資料型別。那怎麼使用它呢?請看下面的C語言程式碼例項:
這樣我們就定義好了 p1 和 p2 兩個結構體變數。事實上,定義好結構體 資料型別之後,可以只使用 struct parallelogram 來定義變數,請看:
這樣定義的 p3 和 p4 與上面那種方式定義的 p1 和 p2 是一樣的。如果採用上面那種定義方式,parallelogram 也可以不寫:
但是這樣就沒有辦法再引用這個結構體型別了,因為它沒有名字。定義好變數後,就可以用“.”運算子來訪問結構體的各個成員了。例如:
很明顯,用結構體來描述平行四邊形的邊長問題,比定義多個 double 變數方便多了。只需要用 struct parallelogram 定義一個變數,這個變數自己內部就有平行四邊形的短邊長,長邊長,對角線1長和對角線2長了。而且不會弄混,p1 和 p2 的成員彼此是隔離的,使用 “p1.”訪問的變數肯定是 p1 的。這樣一來,要定義再多的平行四邊形都不怕了。
C語言結構體的初始化我們使用基礎資料型別時,初始化很方便,直接賦值就可以了,結構體怎麼初始化呢?請看下面的C語言程式碼:
這幾種方式都是可以的,只不過要是使用第一種方式定義,p1 必須是區域性變數。p1 若是全域性變數,就只能用常數表示式定義了。
另外需要特別注意的是,一旦變數定義好了,就不能直接用下面種方式賦值了,但是同類型之間可以賦值:
我們用一個完整的例子結束本節,請看下面的C語言程式碼:
編譯並執行,得到如下結果:
注意,上面定義的變數 a 與 結構體裡的 a 並不衝突,因為結構體裡的 a 是用過“.”運算子訪問的,編譯器可以區分,它們屬於不同的名稱空間。
好了,學會了C語言的結構體,就算是要描述一隻貓,也不怕了。
小結到這裡,相信題主應該能發現C語言結構體的方便之處了。事實上,結構體的用處非常大,如果題主閱讀我的文章,應該會發現,結構體和指標結合起來,簡直“毀天滅地”,能夠實現各種各樣好玩的特性。