c語言中struct怎麼用什麼意思

時間 2021-08-11 17:32:36

1樓:秒懂百科

struct:一種構造資料型別

2樓:zyz鄭遠征

struct是定義一個結構體的關鍵字。例如

struct student

;void main()

3樓:資料**

struct

b 新增義項

?「結構」是一種構造型別,它是由若干「成員」組成的。 每一個成員可以是一個基本資料型別或者又是一個構造型別。

 結構即是一種「構造」而成的資料型別, 那麼在說明和使用之前必須先定義它,也就是構造它。如同在說明和呼叫函式之前要先定義一樣。

10本詞條 正文缺少必要目錄和內容, 歡迎各位 ,額外獲取10個積分。

基本資訊

中文名稱

結構體外文名稱

struct

組成若干成員」

型別構造型別

目錄1結構型別2結構定義    3結構說明4對齊方式

結構型別摺疊編輯本段

在實際問題中,一組資料往往具有不同的資料型別。例如, 在學生登記表中,姓名應為字元型;學號可為整型或字元型; 年齡應為整型;性別應為字元型;成績可為整型或實型。 顯然不能用一個陣列來存放這一組資料。

 因為陣列中各元素的型別和長度都必須一致,以便於編譯系統處理。為了解決這個問題,c語言中給出了另一種構造資料型別——「結構」。 它相當於其它高階語言中的記錄。

「結構」是一種構造型別,它是由若干「成員」組成的。 每一個成員可以是一個基本資料型別或者又是一個構造型別。 結構即是一種「構造」而成的資料型別, 那麼在說明和使用之前必須先定義它,也就是構造它。

如同在說明和呼叫函式之前要先定義一樣。

結構定義摺疊編輯本段

定義一個結構的一般形式為:

struct 結構名

;成員表由若干個成員組成, 每個成員都是該結構的一個組成部分。對每個成員也必須作型別說明,其形式為:

型別說明符 成員名;

成員名的命名應符合識別符號的書寫規定。

例如:struct stu

;在這個結構定義中,結構名為stu,該結構由4個成員組成。 第一個成員為num,整型變數;第二個成員為name,字元型陣列;第三個成員為***,字元型變數;第四個成員為score,浮點型變數。 應注意在括號後的分號是必不可少的。

值得一提的是,在c++中,struct的功能得到了強化,struct不僅可以新增成員變數,還可以新增成員函式,和class類似

結構說明摺疊編輯本段

結構定義之後,即可進行變數說明。 凡說明為結構stu的變數都由上述4個成員組成。由此可見, 結構是一種複雜的資料型別,是數目固定,型別不同的若干有序變數的集合。

請看下面的結構:

struct mystruct

;對結構mystruct採用sizeof會出現什麼結果呢?sizeof(mystruct)為多少呢?也許你會這樣求:

sizeof(mystruct)=sizeof(double)+sizeof(char)+sizeof(int)=13

但是當在vc中測試上面結構的大小時,你會發現sizeof(mystruct)為16。你知道為什麼在vc中會得出這樣一個結果嗎?

其實,這是vc對變數儲存的一個特殊處理。為了提高cpu的儲存速度,vc對一些變數的起始地址做了「對齊」處理。在預設情況下,vc規定各成員變數存放的起始地址相對於結構的起始地址的偏移量必須為該變數的型別所佔用的位元組數的倍數。

下面列出常用型別的對齊方式(vc6.0,32位系統)。

型別對齊方式(變數存放的起始地址相對於結構的起始地址的偏移量)

char

偏移量必須為sizeof(char)即1的倍數

int偏移量必須為sizeof(int)即4的倍數

float

偏移量必須為sizeof(float)即4的倍數

double

偏移量必須為sizeof(double)即8的倍數

short

偏移量必須為sizeof(short)即2的倍數

對齊方式摺疊編輯本段

預設的對齊方式

各成員變數在存放的時候根據在結構中出現的順序依次申請空間,同時按照上面的對齊方式調整位置,空缺的位元組vc會自動填充。同時vc為了確保結構的大小為結構的位元組邊界數(即該結構中佔用最大空間的型別所佔用的位元組數)的倍數,所以在為最後一個成員變數申請空間後,還會根據需要自動填充空缺的位元組。

下面用前面的例子來說明vc到底怎麼樣來存放結構的。

struct mystruct

;為上面的結構分配空間的時候,vc根據成員變數出現的順序和對齊方式,先為第一個成員dda1分配空間,其起始地址跟結構的起始地址相同(剛好偏移量0剛好為sizeof(double)的倍數),該成員變數佔用sizeof(double)=8個位元組;接下來為第二個成員dda分配空間,這時下一個可以分配的地址對於結構的起始地址的偏移量為8,是sizeof(char)的倍數,所以把dda存放在偏移量為8的地方滿足對齊方式,該成員變數佔用sizeof(char)=1個位元組;接下來為第三個成員type分配空間,這時下一個可以分配的地址對於結構的起始地址的偏移量為9,不是sizeof(int)=4的倍數,為了滿足對齊方式對偏移量的約束問題,vc自動填充3個位元組(這三個位元組沒有放什麼東西),這時下一個可以分配的地址對於結構的起始地址的偏移量為12,剛好是sizeof(int)=4的倍數,所以把type存放在偏移量為12的地方,該成員變數佔用sizeof(int)=4個位元組;這時整個結構的成員變數已經都分配了空間,總的佔用的空間大小為:8+1+3+4=16,剛好為結構的位元組邊界數(即結構中佔用最大空間的型別所佔用的位元組數sizeof(double)=8)的倍數,所以沒有空缺的位元組需要填充。所以整個結構的大小為:

sizeof(mystruct)=8+1+3+4=16,其中有3個位元組是vc自動填充的,沒有放任何有意義的東西。

下面再舉個例子,交換一下上面的mystruct的成員變數的位置,使它變成下面的情況:

struct mystruct

;這個結構佔用的空間為多大呢?在vc6.0環境下,可以得到sizeof(mystruct)為24。

結合上面提到的分配空間的一些原則,分析下vc怎麼樣為上面的結構分配空間的。(簡單說明)

struct mystruct

;//所有成員變數都分配了空間,空間總的大小為1+7+8+4=20,不是結構

//的節邊界數(即結構中佔用最大空間的型別所佔用的位元組數sizeof

//(double)=8)的倍數,所以需要填充4個位元組,以滿足結構的大小為

//sizeof(double)=8的倍數。

所以該結構總的大小為:sizeof(mystruct)為1+7+8+4+4=24。其中總的有7+4=11個位元組是vc自動填充的,沒有放任何有意義的東西。

位元組的對齊方式

vc對結構的儲存的特殊處理確實提高了cpu儲存變數的速度,但有時也會帶來一些麻煩,我們也遮蔽掉變數預設的對齊方式,自己可以設定變數的對齊方式。

vc中提供了#pragmapack(n)來設定變數以n位元組對齊方式。n位元組對齊就是說變數存放的起始地址的偏移量有兩種情況:第

一、如果n大於等於該變數所佔用的位元組數,那麼偏移量必須滿足預設的對齊方式,第

二、如果n小於該變數的型別所佔用的位元組數,那麼偏移量為n的倍數,不用滿足預設的對齊方式。結構的總大小也有個約束條件,分下面兩種情況:如果n大於所有成員變數型別所佔用的位元組數,那麼結構的總大小必須為佔用空間最大的變數佔用的空間數的倍數;

否則必須為n的倍數。下面舉例說明其用法。

#pragmapack(push) //儲存對齊狀態

#pragmapack(4)//設定為4位元組對齊

struct test

;#pragmapack(pop)//恢復對齊狀態

以上結構的大小為16,下面分析其儲存情況,首先為m1分配空間,其偏移量為0,滿足我們自己設定的對齊方式(4位元組對齊),m1佔用1個位元組。接著開始為m4分配空間,這時其偏移量為1,需要補足3個位元組,這樣使偏移量滿足為n=4的倍數(因為sizeof(double)大於n),m4佔用8個位元組。接著為m3分配空間,這時其偏移量為12,滿足為4的倍數,m3佔用4個位元組。

這時已經為所有成員變數分配了空間,共分配了16個位元組,滿足為n的倍數。如果把上面的#pragmapack(4)改為#pragma pack(16),那麼我們可以得到結構的大小為24。

c語言中struct是個什麼意思 怎麼用 能不能通俗點說

4樓:阿豪呦

struct是c語言中用來定義一系列具有相同型別或不同型別的資料構成的資料集合,也叫結構體。

c語言中的struct是使用者自定義資料型別(user defined type),它是沒有許可權設定的,它只能是一些變數的集合體,雖然可以封裝資料卻不可以隱藏資料,而且成員不可以是函式。

struct用法和用int定義整型變數一樣,struck就是在程式編輯初要宣告的結構體變數。

5樓:翱翔roc丶

結構(struct)

結構是由基本資料型別構成的、並用一個識別符號來命名的各種變數的組合。

結構中可以使用不同的資料型別。

結構說明和結構變數定義

在turbo c中, 結構也是一種資料型別, 可以使用結構變數, 因此,  象其它 型別的變數一樣, 在使用結構變數時要先對其定義。定義結構變數的一般格式為:

struct 結構名

結構變數;

結構名是結構的識別符號不是變數名。  型別為第二節中所講述的五種資料型別(整型、浮點型、字元型、指標型和 無值型)。

構成結構的每一個型別變數稱為結構成員, 它象陣列的元素一樣, 但陣列中 元素是以下標來訪問的, 而結構是按變數名字來訪問成員的。 下面舉一個例子來說明怎樣定義結構變數。

struct string

person;

這個例子定義了一個結構名為string的結構變數person,   如果省略變數名 person, 則變成對結構的說明。用已說明的結構名也可定義結構變數。這樣定義 時上例變成:

struct string

; struct string person;

如果需要定義多個具有相同形式的結構變數時用這種方法比較方便, 它先作 結構說明, 再用結構名來定義變數。

如果省略結構名, 則稱之為無名結構, 這種情況常常出現在函式內部, 用這 種結構時前面的例子變成:

struct

char name[8];

int age;

char ***[2];

char depart[20];

float wage1, wage2, wage3, wage4, wage5;

} tianyr, liuqi;

結構作為一種資料型別,  因此定義的結構變數或結構指標變數同樣有局 部變數和全程變數, 視定義的位置而定。

結構變數名不是指向該結構的地址, 這與陣列名的含義不同,  因此若需要求結構中第一個成員的首地址應該是&[結構變數名]。

c語言中for語句是怎麼用的,C語言語言中FOR的用法

for語句通常具有如下形式 for statement1 statement2 statement3 這裡,statement1 statement2和statement3是一般的語句。其中statement2應具有布林型別,但在c中具有int型別 因為c語言不支援布林型別 這段語句的執行流程如下 ...

c語言中getch怎麼用,C語言,getch 的用法?

飛喵某 1 這個函式是一個不回顯函式,當使用者按下某個字元時,函式自動讀取,無需按回車,有的c語言命令列程式會用到此函式做遊戲,比如用的遊戲需要用到方向鍵,就可用這個函式讀取。下面用一個示例來演示用法,首先新建一個c語言的空白檔案 2 程式用switch語句輸出4個方向鍵的值,這裡使用getch讀取...

C語言中可以用表示階乘麼,C語言中階乘用什麼符號表示啊

這是c語言的邏輯運算子 異或 這個 講的非常詳細,我摘抄了一些,詳細的你看以看看。有很例子,好懂!邏輯運算子把各個運算的變數 或常量 連線起來組成一個邏輯表示式。邏輯運算子有4個,它們分別是 邏輯非 邏輯或 邏輯與 異或 在位運算裡面還有 位與 位或 的運算。什麼是邏輯運算 邏輯運算用來判斷一件事情...