struct 結構體中對陣列和指標的操作細節

2021-06-22 21:35:07 字數 1274 閱讀 5742

我們需要明確兩個概念:

a、  初始化:分配記憶體並寫入值。

b、  賦值:  查詢記憶體並寫入值。

在結構體中,陣列和指標最大的的區別為:陣列將資訊存在結構體所占有的記憶體中,而指標是將資訊的首位址儲存在結構體所占有的記憶體中,例如:

typedef  struct 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

2:name a=  //right  printf(「%s」,a.a) 得到「lilonglin」

3:name a=  // right  printf(「%s」,a.a) 得到「lilonglin」

為什麼在1中,指定初始化用a時,gcc會提示越界呢。 在編譯的過程中,在語法掃錯階段gcc的對陣列邊界檢查時,發現了該錯誤,從而給出了提示,在vc下則不會,在此不得不佩服gcc的嚴謹。

從2和3我們可以看到當使用不同的下標時對陣列的初始化完全沒有影響,

這不得不懷疑在結構體中,用字串對陣列的初始化時只與陣列名有關,因為陣列名具有指標屬性,之後陣列的各個元素被初始化,讀者可以列印某個陣列元素試試。

此處只討論了用字串初始化的情況,對非字串時指定初始化時,下標將起作用,大家可以試一試

C C 中結構體 struct

c 裡面struct可以new,另外 c 中,struct關鍵字與class關鍵字基本是一樣的,但是,有兩點不同 1 struct定義的資料型別裡面所有成員預設級別都是共有的,而class裡面所有成員預設級別都是私有的 2 在模板定義中,只能用class 或者typename 而不能用struct提...

sort 排序(對陣列 結構體)

1 基本規則 sort 陣列起始指標,陣列尾指標,排序規則 note 標頭檔案是 include algorithm 陣列起始指標,陣列尾指標 左閉右開 排序規則 可省略,可自己寫 原理很簡單,掌握規則即可,下面舉幾個例子練習 2 對陣列排序 例1 int a sort a,a 7 預設 小 大 排...

C C 中的結構體 struct

什麼是結構體?簡單的來說,結構體就是乙個可以包含不同資料型別的乙個結構,它是一種可以自己定義的資料型別,它的特點和陣列主要有 兩點不同,首先結構體可以 在乙個結構中宣告不同的資料型別,第二相同結構的結構體變數是可以相互賦值的,而陣列是做不到的,因為陣列是單一資料型別的資料集合,它本身不是資料型別 而...