struct
結構體疑惑(
c語言)
(如有錯,請務必指正)
本文主要介紹在
struct
結構體中對陣列和指標的操作細節。
我們需要明確兩個概念:
a、初始化:分配記憶體並寫入值。 b、
賦值:查詢記憶體並寫入值。
在結構體中,陣列和指標最大的的區別為:陣列將資訊存在結構體所占有的記憶體中,而指標是將資訊的首位址儲存在結構體所占有的記憶體中,例如:
typedefstruct namename;
name a=;
結構體物件
a中的陣列會將字串常量「
lilonglin
」copy到a
的儲存記憶體中,而
a中的指標只儲存字串常量在靜態常量儲存區中的首位址。
在結構體中對陣列的初始化和賦值有以下需要注意:
一、賦值 例如
定義結構體物件
name a;
在使用時,編譯器將會為該結構體分配記憶體空間,但為對結構物件
a的變數初始化。
此時只能通過賦值操作來寫入值。在對陣列
a[10]
的賦值時應謹慎,例如: a.
a.a[10]=」lilonglin」, gcc
將給出警告
:「賦值時將指標賦給整數,未作型別轉換」,該警告主要由兩個原因引起:1、
「.」結構體成員運算子的作用是訪問結構體中個成員,該處操作的是結構體變數
a中陣列的第
10個元素,雖然該下標已經越界;2、「
lilonglin
」在此處編譯器理解為乙個常指標,指標是不能直接賦值給字元變數的。 b.
a.a=
「lilonglin
」,gcc
將會提示錯誤:賦值時,型別不相容。
在定義申明完陣列後陣列名具有常量特性,表示陣列儲存空間的開始位址,而
c語言中不能對常量賦值。 c.
根據陣列的特性,如果需要得到對陣列的正確賦值,則需要對陣列的每個元素進行對應賦值。在此不再舉例。 二、
初始化
在結構體初始化時,用字串對陣列的初始化也需要有注意的地方,例如:
a、name a=//ok b、
1:name a=//errorgcc提示:
初始化陣列索引越界。 2
:name a=//rightprintf(「%s」,a.a)
得到「lilonglin」
3:name a=// rightprintf(「%s」,a.a)
得到「lilonglin」
為什麼在
1中,指定初始化用a【
10】時,
gcc會提示越界呢。
在編譯的過程中,在語法掃錯階段
gcc的對陣列邊界檢查時,發現了該錯誤,從而給出了提示,在
vc下則不會,在此不得不佩服
gcc的嚴謹。 從
2和3我們可以看到當使用不同的下標時對陣列的初始化完全沒有影響,
這不得不懷疑在結構體中,用字串對陣列的初始化時只與陣列名有關,因為陣列名具有指標屬性,之後陣列的各個元素被初始化,讀者可以列印某個陣列元素試試。
此處只討論了用字串初始化的情況,對非字串時指定初始化時,下標將起作用,大家可以試一試。
C語言結構體struct
定義 定義結構體,要定義兩次,1定義型別,2定義變數 1定義時 不分配記憶體,和 define一樣 定義結構體的樣式,叫什麼名字,成員,句式 2再定義 分配記憶體 用著個樣式定義變數 與typedef有點像 3如果定義的是 p指標,只表示出此結構體 變數的起始位址 struct a struct a...
C語言結構體(Struct)
在c 語言中,可以使用結構體 struct 來存放一組不同型別的資料。結構體的定義形式為 struct 結構體名 結構體是一種集合,它裡面包含了多個變數或陣列,它們的型別可以相同,也可以不同,每個這樣的變數或陣列都稱為結構體的成員 member 請看下面的乙個例子 struct stu stu 為結...
C語言 結構體struct 結構體對齊
1 定義乙個結構體 順便例項結構體變數 struct tag 結構體型別名 struct tag 這兩者共同構成了結構體型別 單獨的tag 結構體型別名 不能稱之為結構體型別 結構體變數名 2 定義的同時使用typedef 相當於定義結構體 為結構體起新名字 typedef struct tag 結...