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

C程序設計語言精華筆記(四):結構體、聯合體、可變參數與標準庫深度應用

     編輯:關於C語言

結構體

  • 定義:struct tag { members } vars;,tag 可省略,vars 可省略(僅聲明模板)。
  • 初始化:struct point p = {10, 20}; 或指定成員 .x = 10(C99)。
  • 訪問:變量用 .,指針用 ->(p->x ≡ (*p).x)。
  • 傳遞:按值傳遞(拷貝整個結構),大結構建議傳指針。
  • 嵌套:結構可包含結構/指針/數組。
  • 結構數組:struct key { char *word; int count; } keytab[] = {{"auto",0},{"break",1}};

sizeof 應用

  • sizeof object 或 sizeof(type) 返回字節數(size_t)。
  • 結構體大小受對齊影響,可能大於成員大小之和。
  • 可用於 #define,不可用於 #if(預處理器不識別)。

typedef 類型別名

typedef int Length;
typedef char *String;
typedef struct { char *word; int count; } Key;
typedef struct tnode *Treeptr;
typedef int (*PFI)(char *, char *);  // 函數指針類型

不創建新類型,僅為現有類型起別名,增強可讀性。

聯合體

  • 成員共用內存,大小 = 最大成員大小,同一時刻僅一個成員有效。
  • 讀取類型必須與最近寫入類型一致,否則 UB。
  • 常用於類型懲罰、協議解析、節省內存。

可變參數 <stdarg.h>

#include 

int sum(int first, ...) {
    va_list ap;
    va_start(ap, first);  // first 為最後一個固定參數
    int s = 0, val = first;
    while (val != -1) {
        s += val;
        val = va_arg(ap, int);
    }
    va_end(ap);
    return s;
}
// sum(2,3,4,-1) → 9

步驟:聲明 va_list → va_start 初始化 → 循環 va_arg 取參 → va_end 清理。至少需一個固定參數。

字符串操作 <string.h>

函數功能
strcpy/strncpy複製字符串/前 n 字符
strcat/strncat拼接字符串/前 n 字符
strcmp/strncmp比較字符串/前 n 字符
strlen長度(不含 \0)
strchr/strrchr查找字符首次/最後出現位置

字符測試與轉換 <ctype.h>

  • 測試:isalpha, isupper, islower, isdigit, isalnum, isspace → 非 0 為真。
  • 轉換:toupper, tolower → 返回轉換後字符。
  • 參數為 int(可表示 unsigned char 或 EOF)。

數學函數 <math.h>

均接受/返回 double:sin, cos, tan, asin, acos, atan, atan2, exp, log, log10, pow, sqrt, fabs, ceil, floor, fmod。

隨機數 <stdlib.h>

  • rand() → [0, RAND_MAX] 偽隨機整數。
  • srand(seed) 設置種子。
  • 浮點 [0,1):#define frand() ((double)rand() / (RAND_MAX + 1.0))。

動態內存管理

函數原型特點
mallocvoid *malloc(size_t n)分配 n 字節,不初始化
callocvoid *calloc(size_t n, size_t size)分配 n*size 字節,清零
freevoid free(void *p)釋放 p 指向塊,p 需來自 malloc/calloc

正確釋放鏈表:

for (p = head; p != NULL; ) {
    q = p->next;
    free(p);
    p = q;
}

錯誤寫法 for(p=head; p; p=p->next) free(p); 會訪問已釋放內存。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved