Struct 結構體疑惑(c語言)

2021-04-23 08:04:10 字數 1623 閱讀 6367

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 結...