結構含義
結構有兩層含義:一層含義是“結構佈局”,結構佈局告訴編譯器如何表示數據,未讓編譯器爲數據分配空間。創建一個結構變量,即爲另一層含義。
建立結構聲明
#include<stdio.h>
struct stuff
{
int number;
char code[4];
float cost;
};
int main(void)
{
struct stuff library; //創建了一個結構變量 library
//編譯器使用 stuff 模板爲該變量分配空間
//stuff book 相當於聲明中的 int 或 float
//可定義多個變量,甚至是指向 struct stuff 類型的指針
return 0;
}
- 一個結構的內存分配
- 就計算機而言,下面的聲明
struct stuff library;
//是以下聲明的簡化,聲明結構的過程和定義結構變量的過程組合成一個步驟
struct stuff
{
int number;
char code[4];
float cost;
}library;
初始化結構
struct stuff library = {10,'c',12};
//訪問初始化後的中用結構成員運算符"."訪問成員
printf("%d", library.number);
結構數組聲明
struct book library[100]; //library 是一個數組名,不是結構名,數組中每個元素都是 struct book 類型的結構變量。
- 一個結構數組的內存分配
指向結構的指針
struct stuff* p; //聲明並未創建一個新的結構,可以指向任意現有 stuff 類型的結構
p = &math //如果 math 是 stuff 類型,結構名並不是結構地址,因此指向的結構前面要加上“&”
//指針訪問成員,以下等價
p->number == (*p).number == math.number
typedef 關鍵字
利用 typedef 可以爲某一類型自定義名稱,通常用大寫字母表示定義的名稱,以提示用戶這個類型名實際上是一個符號的縮寫。與 #define 類似,但兩者有 3 處不同:
- tyoedef 創建的符號只受限於類型,不能用於值。
- typedef 由編譯器解釋,不是預處理器。
- 受限範圍內,typedef 比 #define 更靈活。
typedef unsigned char BYTE; //爲現有類型創建一個名稱
typedef char* STRING; //把 STRING 解釋成類型的標識符,該類型是指向 char 的指針
char* string; //把 STRING 識別爲一個指向 char 的指針變量
STRING name,sign; //相當於 char* name,*sign
typedef struct
{
double x;
double y;
}rect;
rect r1 = { 3.0,3.6 }; //被翻譯成 struct{double x;double y}r1 = {3.0,3.6};
rect r2; //被翻譯成 struct{double x;double y}r2;
r2 = r1; //C 認爲兩個結構的類型相同,所以賦值是有效操作