首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言進階:列舉、結構、類型定義與聯合完整指南

     編輯:關於C語言

C 語言進階:列舉、結構、類型定義與聯合完整指南

本文深入解析 C 語言的複合型別系統:enum 列舉、struct 結構、typedef 類型別名、union 聯合,並附上完整程式碼範例與記憶體佈局分析。

一、列舉

1. 基本語法

enum COLOR { RED, YELLOW, GREEN };

列舉常數預設從 0 遞增,屬 int 型別。可指定值:enum { RED=1, YELLOW, GREEN=5 }。

2. 列舉 vs const int vs 宏

  • 列舉:有型別檢查、除錯器可見、可自動計數(如 NumCOLORS)、支援陣列索引。
  • const int:各自獨立,無群組語意。
  • 宏:無型別,僅文字替換。

3. 實務模式:自動計數 + 字串查表

enum COLOR { RED, YELLOW, GREEN, NumCOLORS };
char *ColorNames[NumCOLORS] = { "red", "yellow", "green" };
// 使用 ColorNames[color] 直接查找,避免 switch

二、結構

1. 宣告與初始化

struct date { int month; int day; int year; };
struct date today = {6, 28, 2015};           // 依序賦值
struct date thismonth = {.month=6, .year=2015}; // 指定成員(C99)

2. 結構操作

  • 成員存取:today.day、pDate->month(指標用 ->)。
  • 整體賦值:p1 = p2(逐成員複製),陣列不支援此操作。
  • 結構指標:struct date *p = &today;,注意結構變數名不是地址。

3. 結構與函數

  • 傳值:函數內修改不影響原結構(複製品)。
  • 回傳結構:可直接回傳區域結構變數(複製回呼叫端)。
  • 傳指標:大型結構建議傳指標避免複製開銷,配合 const 防誤改。

4. 巢狀結構與結構陣列

struct rectangle { struct point pt1; struct point pt2; };
struct rectangle r;
r.pt1.x = 10; // 多層存取
struct rectangle rects[] = { {{1,2},{3,4}}, {{5,6},{7,8}} };

5. 記憶體對齊與 sizeof

struct time { int hour, min, sec; };
struct time ab = {1,5,7};
sizeof(ab) == 12; // 4+4+4,無填充
// 但結構內可能因對齊產生空洞,相鄰成員位址差不一定等於 sizeof(成員)

三、類型定義

1. 基本用法

typedef int Length;
typedef struct { int month, day, year; } Date;
Date d = {9, 1, 2005}; // 直接用 Date,無需 struct 關鍵字

2. 進階應用

  • 自訂固定寬度整數:typedef long int64_t; 提升可移植性。
  • 簡化複雜宣告:typedef struct node { int data; struct node *next; } Node;

四、聯合

1. 特性

  • 所有成員共用同一塊記憶體,大小 = 最大成員大小。
  • 同一時間只有一個成員有效。
  • 初始化僅針對第一個成員。

2. 實例:檢視 int 位元組序

typedef union { int i; char ch[sizeof(int)]; } CHI;
CHI chi; chi.i = 1234; // 0x000004D2
// 小端序輸出:D2 04 00 00

五、結構 vs 陣列

  • 陣列:同質元素、連續儲存、下標存取、大小固定。
  • 結構:異質成員、邏輯分組、名字存取、可巢狀、支援整體複製。
  • 現代語言(C++、Rust、Go)以結構/類別為核心資料抽象單元。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved