C語言結構體

2021-05-26 11:23:54 字數 4666 閱讀 8026

1.1.1 結構概念

1.結構存在的意義

存在是合理的,許多事物的存在是在不斷解決問題引入的,當然有更好的方法出現時改變也是合理的。在實際問題中,一組資料往往具有不同的資料型別。例如,在學生登記表中,姓名應為字元型,學號可為整型或字元型,年齡應為整型,性別應為字元型,成績可為整型或實型。顯然不能用乙個陣列來存放這一組資料,因為陣列中各元素的型別和長度都必須一致,以便於編譯系統處理。為了解決這個問題,c語言中給出了另一種構造資料型別—「結構(structure)」或叫「結構體」,它相當於其他高階語言中的記錄。「結構」是一種構造型別,它是由若干「成員」組成的,每乙個成員可以是乙個基本資料型別或者又是乙個構造型別。結構既是一種「構造」而成的資料型別,那麼在說明和使用之前必須先定義它,也就是先構造它,如同在宣告和呼叫函式之前要先定義函式一樣。

定義乙個結構的一般語法形式如下:

struct 結構名

成員表列

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

型別說明符 成員名;

成員名的命名應符合識別符號的書寫規定。結構定義舉例說明如下:

struct stu

int num;

char name[20];

char ***;

float score;

在這個結構定義中,結構名為stu,該結構由4個成員組成。第乙個成員是num,為整型變數;第二個成員是name,為字元陣列;第三個成員是***,為字元變數;第四個成員是score,為實型變數。應注意在括號後的分號是不可缺少的。結構定義之後,即可進行結構變數定義,凡定義為結構stu的變數都由上述4個成員組成。由此可見,結構是一種複雜的資料型別,是數目固定,型別不同的若干有序變數的集合。

2.結構概念小結

結構是一種構造資料型別。

結構的用途是把不同型別的資料組合成乙個整體,是自定義資料型別。

結構型別定義語法形式如下:

struct     [結構名]

型別識別符號    成員名;

型別識別符號    成員名;

}[變數名1, 變數名2……];

定義結構變數方法為:struct   結構名   變數名。

結構變數引用規則為:結構變數不能整體引用,只能引用變數成員,引用方式為結構變數名.成員名,可以將乙個結構變數賦值給另乙個結構變數,結構巢狀時需要逐級引用。

1.1.2 結構變數

1. 結構變數有以下三種定義方法

(1) 先定義結構,再定義結構變數

struct stu

int num;

char name[8];

char ***;

float score;

struct stu boy1,boy2;

(2) 在定義結構型別的同時定義結構變數

struct stu

int num;

char name[8];

char ***;

float score;

}boy1,boy2;

(3) 直接定義結構變數

struct

int num;

char name[8];

char ***;

float score;

}boy1,boy2;

第三種方法與第二種方法的區別在於第三種方法中省去了結構名,而直接給出結構變數。三種方法中說明的boy1、boy2變數都具有下圖6-2所示的結構。

num            name              ***   score

圖6-2 結構變數組成圖

2. 結構變數記憶體布局

所有c語言中的變數經過編譯後都會轉換為對記憶體線性位址的操作。各種變數的引入是面向人類思維進行的,方便人們高效的程式設計,而c語言源**經過gcc編譯後,形成執行碼時,所有變數與符號失去意義,變數與符號轉變為對相應記憶體位址的操作。int型別代表著4個位元組相應位址的記憶體空間的抽象,而結構變數也是代表著一片記憶體空間的抽象(結構名不代表記憶體位址),所以相同型別結構變數與int型別變數一樣可以用=號直接賦值(如boy2=boy1),兩個結構變數用=號賦值代表兩片相同大小空間的複製拷貝。

記憶體的實體地址是線性的,一維的,而結構變數往往代表二維或多維。這種二維或多維結構是方便人們程式設計時對變數進行管理,是一種面向人們思維的邏輯結構,但結構變數最終物理表現在記憶體中還是一維線性結構。

下面以上面定義的boy1來說明結構變數在記憶體中儲存方式。表6-4列出了結構變數boy1的記憶體布局,此時boy1代表著-19到0這片記憶體空間的抽象。&boy1代表結構變數的位址,即為0。結構成員(如boy1.num)其實也代表著對應位址記憶體空間的抽象,對結構成員的操作編譯器最後會轉化為對相應記憶體位址的操作。

表6-4 boy1結構變數記憶體布局表

假定棧空間起始位址為0

記憶體位址

記憶體說明

0boy1.num

-1-2

-3-4

boy1.name[7]

-5boy1.name[6]

-7boy1.name[5]

-8boy1.name[4]

-9boy1.name[3]

-10boy1.name[2]

-11boy1.name[1]

-12boy1.name[0]

body.name表示記憶體位址-12

-13boy1.***

-14float為4個位元組,需要-16處才能對齊,所以空兩個位元組

-15-16

boy1.score

-17-18

-19

3. 結構變數成員的引用

表示結構變數成員引用的一般形式如下:

結構變數名.成員名

例如:boy1.num          即第乙個人的學號

boy2.***          即第二個人的性別

如果成員本身又是乙個結構則必須逐級找到最低階的成員才能引用。

4. 結構變數的賦值

結構變數的賦值就是給各成員賦值,可用輸入語句或賦值語句來完成。

例6-4】給結構變數賦值並輸出其值。

stru1.c源**如下:

#include

int main()

struct stu

int num;

char name[20];

char ***;

float score;

} boy1,boy2;

boy1.num=102;

boy1.name="zhang ping";

printf("input *** and score\n");

scanf("%c %f",&boy1.***,&boy1.score);

boy2=boy1;

printf("number=%d\nname=%s\n",boy2.num,boy2.name);

printf("***=%c\nscore=%f\n",boy2.***,boy2.score);

return 0 ;

編譯 gcc  stru1.c -o  stru1。

執行 ./stru1, 執行結果如下:

input *** and score

m 90

number=102

name=zhang ping

***=m

score=90.000000

5. 結構變數的初始化

例6-5】對結構變數初始化。

stru2.c源**如下:

#include

int main()

struct stu   

int num;

char *name;

char ***;

float score;

}boy2,boy1=;

boy2=boy1;

printf("number=%d\nname=%s\n",boy2.num,boy2.name);

printf("***=%c\nscore=%f\n",boy2.***,boy2.score);

return 0 ;

編譯 gcc  stru2.c -o  stru2。

執行 ./stru2, 執行結果如下:

number=102

name=zhang ping

***=m

score=78.500000

6. 結構陣列的定義

結構陣列的定義與初始化方法如下:

struct stu

int num;

char name[20];

char ***;

float score;

}boy[5]=,,,

,,當對全部元素作初始化賦值時,也可不給出陣列長度。

引用結構陣列成員的方法如下:

結構[下標].成員變數

如boy[0].num, boy[1].name

摘錄自《深入淺出linux工具與程式設計》

C語言 結構體

宣告乙個結構體型別 struct 結構體名 成員表列 定義結構體變數的方法 1 先宣告結構體型別再定義變數名。在定義了結構體變數後,系統會為之分配記憶體單元.例如 struct student student1,student2 2 在宣告型別的同時定義變數,例如 struct 結構體名 成員表列 ...

c語言 結構體

1 定義結構體 c語言允許使用者自己建立不同型別資料組成的組合型的資料結構 struct 結構體名 1 結構體的型別不是只有一種,可以根據需要設計許多種,如struct student struct worker等 2 結構體的成員可以是另一結構體的成員,注意的是引用此成員的方式 2 定義結構體變數...

C語言 結構體

以前學過的基本資料型別有int型 儲存整形資料 float型 儲存浮點型資料 char型 儲存字元型資料 這些都是不能拆分的基本資料型別,而結構體也是一種資料型別,它是一種構造型別,是可以進行拆分的。結構體裡可以儲存整形資料 浮點型資料 字元型資料.相當於把基本資料型別整合到結構體裡 結構體命名 s...