C語言學習筆記 結構體

2021-09-02 19:13:32 字數 4221 閱讀 7225

1、結構體定義:結構體是將不同型別的資料按照一定的功能需求進行整體封裝,封裝的資料型別與大小均可以由使用者指定。

2、結構體宣告:宣告乙個結構體型別的一般形式為:

struct 結構體名

例如:

struct book ;
注意:「結構體名」的命名規範是全部使用大寫字母。

3、定義結構體變數:定義結構體型別變數有兩種方法。

(1)先宣告「結構體型別」,再定義「結構體型別變數」。這種方式比較自由。

比如在所有函式前定義了乙個結構體型別 struct book,那麼就可以在所有函式中使用它來定義區域性的結構體型別變數。如:

struct book book1,book2;
book1和book2 就是我們定義的結構體變數名。定義了結構體變數之後,系統就會為之分配記憶體單元。如果 book1和book2是在某個函式中定義的區域性變數,那麼就只能在該函式中使用。在其他函式中可以定義重名的結構體變數而不會相互產生影響。

(2)宣告結構體型別的同時定義結構體變數。

注意:如果在所有函式前宣告結構體型別,那麼定義的變數就是全域性變數;而如果要定義區域性變數,那麼就只能在某個函式中對結構體型別進行宣告,從而導致只能在這個函式中使用這個型別。如:

struct book book1,book2;
這樣就宣告了乙個結構體型別,並用這個型別定義了結構體變數 book1和book2。

注意:(1)「結構體型別」的宣告和使用與函式的定義和使用有所不同,函式的定義可以放在呼叫處的後面,只需在前面宣告一下即可。但是「結構體型別」的宣告必須放在「使用結構體型別定義結構體變數」的前面。

(2)如果程式規模比較大,往往會將結構體型別的宣告集中放到乙個以 .h 為字尾的標頭檔案中。哪個原始檔需要用到此結構體型別,只要用 #include 命令將該標頭檔案包含到該檔案中即可,這樣做便於修改和使用。

4、結構體變數引用

(1)引用方式為:結構體變數名.成員名;如:book1.value=1.95;

(2)如果結構體型別中的成員也是乙個結構體型別,則要用若干個「.」,一級一級地找到最低一級的成員。

(3)可以引用「結構體變數成員」的位址,也可以引用「結構體變數」的位址。如:&book1.title& book1,前者表示book1.title這個成員在記憶體中的首位址,後者表示結構體變數book1在記憶體中的首位址。它們表示的是同乙個記憶體空間的位址,但它們的型別是不同的。& book1是結構體變數的位址 ,是struct book*型的;而book1.title是陣列名,所以是char*型的。型別的不同導致它們在程式中不能相互替換。

(4)「結構體變數名」可以與「 結構體成員名」同名;「結構體變數名」可以與「結構體名」同名;兩個結構體型別定義的結構體變數中的成員可以同名。

5、結構體變數的初始化:結構體變數的初始化方式有兩種。

(1)定義的時候初始化,如:

struct book book1=;
(2)定義之後對結構體變數進行初始化,如;

struct book book1;

strcpy(book1.title, "c primer plus");

strcpy(book1.author, "prata,s.");

book1.value=19.5;

1、結構體陣列定義struct book book[5];;這就定義了乙個結構體陣列,共有 5 個元素,每個元素都是乙個結構體變數,都包含所有的結構體成員。

結構體陣列的引用與引用乙個結構體變數在原理上是一樣的。只不過結構體陣列中有多個結構體變數,可以利用 for 循 環乙個乙個地使用結構體陣列中的元素。如:

# include # include struct book ;

void outputbook(struct book book[5]); //函式宣告, 該函式的功能是輸出書的資訊

int main(void)

outputbook(book);

return 0;

}void outputbook(struct book book[5])

}

2、結構體陣列定義時初始化:結構體陣列的初始化與數值型陣列的初始化是一樣的,數值型陣列初始化的方法和需要注意的問題在結構體陣列的初始化中同樣適用,因為不管是數值型陣列還是結構體陣列都是陣列。如:

struct book book[5]=,,,, };
1、指向結構體變數的指標

struct book *p = null;  /*定義乙個指向struct book結構體型別的指標變數p*/

p = &book1; /*p指向結構體變數book1的首位址, 即第乙個成員的位址*/

用指標引用結構體變數成員的方式是:

(1)(*指標變數名).成員名,如:(*p).book1.value = 26;

(2)指標變數名->成員名,如:p->book1.value = 26;

2、指向結構體陣列的指標

如果定義乙個結構體指標變數並把結構體陣列的陣列名賦給這個指標變數的話,就意味著將結構體陣列的第乙個元素,即第乙個結構體變數的位址,也即第乙個結構變數中的第乙個成員的位址賦給了這個指標變數。如:

struct book book[5]=,,,, };

struct stu *p = book;

此時指標變數 p 就指向了結構體陣列的第乙個元素,即指向 book[0]。我們知道,當乙個指標指向乙個陣列後,指標就可以通過移動的方式指向陣列的其他元素。

這個原則對結構體陣列和結構體指標同樣適用,所以p+1 就指向 book[1] 的首位址;p+2 就指向 book[2]的首位址……所以只要利用 for 迴圈,指標就能乙個個地指向結構體陣列元素。如:

# include struct book ;

int main(void)

,,,, };

struct book *p = book;

for (int i=0; i<5; i++)

return 0;

}

for (int i=0; i<5; i++)
結構體可以作為函式引數使用,可以選擇傳遞結構體本身,還是傳遞指向結構體的指標或者是結構體成員。

1、傳遞結構體成員

# include struct book ;

float sum(float,int);

int main(void)

; printf("總價為:%f\n",sum(book.value,10));//傳遞結構體成員

return 0;

}float sum(float x,int y)

# include struct book ;

float sum(const struct book *);

int main(void)

; return 0;

}float sum(const struct book * value)

3、傳遞結構

# include struct book ;

float sum(const struct book book);

int main(void)

; printf("總價為:%f\n",sum(book));//傳遞結構

return 0;

}float sum(const struct book book)

C語言學習筆記 結構體

struct stu 順帶宣告 在結構體宣告的最後的分號前加stu1,stu2這樣的變數名,不需要寫結構體的名字。利用結構體名來宣告變數 struct stu stu3 struct stu stu1,stu2,stu3 這樣的語句中struct stu就可以理解成變數宣告前的int,double等...

C語言學習筆記 結構體

結構體是一種資料型別,用 struct 關鍵字來修飾,定義乙個結構體可以這樣 123 45 struct teacher 如果用 typedef 修飾,就可以直接使用 teacher 123 4567 typedef struct teacher teacher teacher null 為結構體申...

C語言學習筆記 結構體

在c語言中,結構體 struct 指的是一種資料結構,是c語言中聚合資料型別 aggregate data type 的一類。我們在程式裡會建立很多變數,有時候我們需要用某個變數來描述乙個人,而乙個人身上的特點有很多,不止乙個,如果只用乙個特點來描述就顯得不那麼準確。所以我們要建立多個不同的變數來描...