選單
×
   ❮   
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP 如何 W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

C 結構體 (structs)


結構體

結構體(也稱為 struct)是一種將幾個相關變數組合到一個地方的方式。結構體中的每個變數都稱為結構體的成員

陣列不同,結構體可以包含許多不同的資料型別(int、float、char 等)。


建立結構體

您可以使用 struct 關鍵字建立結構體,並在花括號內宣告其每個成員

struct MyStructure {   // 結構體宣告
  int myNum;           // 成員(int 變數)
  char myLetter;       // 成員(char 變數)
}; // 用分號結束結構體

要訪問結構體,您必須建立它的變數。

main() 方法中使用 struct 關鍵字,後跟結構體名稱,然後是結構體變數名稱

建立一個名為“s1”的結構體變數

struct myStructure {
  int myNum;
  char myLetter;
};

int main() {
  struct myStructure s1;
  return 0;
}

訪問結構體成員

要訪問結構體的成員,請使用點語法(.

示例

// 建立一個名為 myStructure 的結構體
struct myStructure {
  int myNum;
  char myLetter;
};

int main() {
  // 建立一個名為 s1 的 myStructure 結構體變數
  struct myStructure s1;

  // 為 s1 的成員賦值
  s1.myNum = 13;
  s1.myLetter = 'B';

  // 列印值
  printf("我的數字: %d\n", s1.myNum);
  printf("我的字母: %c\n", s1.myLetter);

  return 0;
}
自己動手試一試 »

現在您可以輕鬆地使用一個結構體建立多個具有不同值的結構體變數

示例

// 建立不同的結構體變數
struct myStructure s1;
struct myStructure s2;

// 為不同的結構體變數賦值
s1.myNum = 13;
s1.myLetter = 'B';

s2.myNum = 20;
s2.myLetter = 'C';
自己動手試一試 »


結構體中的字串怎麼辦?

請記住,C 中的字串實際上是字元陣列,不幸的是,您不能像這樣為陣列賦值

示例

struct myStructure {
  int myNum;
  char myLetter;
  char myString[30];  // 字串
};

int main() {
  struct myStructure s1;

  // 嘗試為字串賦值
  s1.myString = "Some text";

  // 嘗試列印值
  printf("我的字串: %s", s1.myString);

  return 0;
}

將會發生錯誤

prog.c:12:15: error: 賦值給陣列型別表示式
自己動手試一試 »

但是,對此有一個解決方案!您可以使用 strcpy() 函式並將值賦給 s1.myString,如下所示

示例

struct myStructure {
  int myNum;
  char myLetter;
  char myString[30]; // 字串
};

int main() {
  struct myStructure s1;

  // 使用 strcpy 函式為字串賦值
  strcpy(s1.myString, "Some text");

  // 列印值
  printf("我的字串: %s", s1.myString);

  return 0;
}

結果

我的字串:一些文字
自己動手試一試 »

更簡單的語法

您還可以在宣告時在單行中為結構體變數的成員賦值。

只需將值以逗號分隔的列表形式插入花括號 {} 中。請注意,使用此技術時,您不必為字串值使用 strcpy() 函式

示例

// 建立一個結構體
struct myStructure {
  int myNum;
  char myLetter;
  char myString[30];
};

int main() {
  // 建立一個結構體變數併為其賦值
  struct myStructure s1 = {13, 'B', "Some text"};

  // 列印值
  printf("%d %c %s", s1.myNum, s1.myLetter, s1.myString);

  return 0;
}
自己動手試一試 »

注意:插入值的順序必須與結構體中宣告的變數型別順序匹配(13 用於 int,'B' 用於 char 等)。


複製結構體

您還可以將一個結構體賦值給另一個結構體。

在以下示例中,s1 的值被複制到 s2

示例

struct myStructure s1 = {13, 'B', "Some text"};
struct myStructure s2;

s2 = s1;
自己動手試一試 »

修改值

如果您想更改/修改一個值,可以使用點語法(.)。

要修改字串值,strcpy() 函式再次派上用場

示例

struct myStructure {
  int myNum;
  char myLetter;
  char myString[30];
};

int main() {
  // 建立一個結構體變數併為其賦值
  struct myStructure s1 = {13, 'B', "Some text"};

  // 修改值
  s1.myNum = 30;
  s1.myLetter = 'C';
  strcpy(s1.myString, "Something else");

  // 列印值
  printf("%d %c %s", s1.myNum, s1.myLetter, s1.myString);

  return 0;
}
自己動手試一試 »

修改值在複製結構體值時特別有用

示例

// 建立一個結構體變數併為其賦值
struct myStructure s1 = {13, 'B', "Some text"};

// 建立另一個結構體變數
struct myStructure s2;

// 將 s1 的值複製到 s2
s2 = s1;

// 更改 s2 的值
s2.myNum = 30;
s2.myLetter = 'C';
strcpy(s2.myString, "Something else");

// 列印值
printf("%d %c %s\n", s1.myNum, s1.myLetter, s1.myString);
printf("%d %c %s\n", s2.myNum, s2.myLetter, s2.myString);
自己動手試一試 »

好的,那麼結構體有什麼用呢?

想象一下,您必須編寫一個程式來儲存有關汽車的不同資訊,例如品牌、型號和年份。結構體的優點在於,您可以建立一個單一的“汽車模板”,並將其用於您製造的每輛汽車。請參閱下面的真實示例。


現實生活中的例子

使用結構體儲存有關汽車的不同資訊

示例

struct Car {
  char brand[50];
  char model[50];
  int year;
};

int main() {
  struct Car car1 = {"BMW", "X5", 1999};
  struct Car car2 = {"Ford", "Mustang", 1969};
  struct Car car3 = {"Toyota", "Corolla", 2011};

  printf("%s %s %d\n", car1.brand, car1.model, car1.year);
  printf("%s %s %d\n", car2.brand, car2.model, car2.year);
  printf("%s %s %d\n", car3.brand, car3.model, car3.year);

  return 0;
}
自己動手試一試 »

C 練習

透過練習來測試自己

練習

填寫缺失的部分以建立一個汽車結構體

 Car {
  char brand[50];
  char model[50];
  int year;
};

開始練習



×

聯絡銷售

如果您想將 W3Schools 服務用於教育機構、團隊或企業,請傳送電子郵件給我們
sales@w3schools.com

報告錯誤

如果您想報告錯誤,或想提出建議,請傳送電子郵件給我們
help@w3schools.com

W3Schools 經過最佳化,旨在方便學習和培訓。示例可能經過簡化,以提高閱讀和學習體驗。教程、參考資料和示例會不斷審查,以避免錯誤,但我們無法保證所有內容的完全正確性。使用 W3Schools 即表示您已閱讀並接受我們的使用條款Cookie 和隱私政策

版權所有 1999-2024 Refsnes Data。保留所有權利。W3Schools 由 W3.CSS 提供支援