int getInt() { return 10; }
double getDouble() { return 5.5; }
int main() {
int n = getInt();
double d = getDouble();
printf("%d\n%lf\n", n, d);
return 0;
}
int,**危險**(C99 移除,現代編譯器報警/錯)。double f2(int a, int b); 或 double f2(void);(無參數)。參數名可省略,類型必須保留。void fun1(int a) { a += 10; } // 值傳遞,不影響實參
void fun2(int arr[]) { arr[0] += 10; } // 數組退化為指針,影響實參
**核心**:C 語言**只有值傳遞**。數組傳遞實為首元素地址(指針值),函數內修改指針指向的內存會影響外部。
return:返回調用者,棧幀展開,繼續執行。exit(code):直接終止整個進程,調用註冊的 atexit 處理函數,刷新標準 I/O 緩衝區。**調用後不再返回**。// 遞歸
int fact_rec(int n) {
if (n == 1) return 1;
return n * fact_rec(n - 1);
}
// 迭代(遞推)
int fact_iter(int n) {
int r = 1;
for (int i = 2; i <= n; i++) r *= i;
return r;
}
// 遞歸:O(2^n) 極慢
long fib_rec(int n) {
if (n <= 2) return 1;
return fib_rec(n-1) + fib_rec(n-2);
}
// 迭代:O(n) 快
long fib_iter(int n) {
long a = 1, b = 1, c = 1;
for (int i = 3; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return c;
}
**教訓**:重疊子問題導致遞歸指數複雜度,**動態規劃/迭代優化為線性**。
void hanoi(int n, char from, char aux, char to) {
if (n == 1) {
printf("%c -> %c\n", from, to);
return;
}
hanoi(n-1, from, to, aux); // n-1 從 from 借 to 移到 aux
printf("%c -> %c\n", from, to); // 第 n 個從 from 移到 to
hanoi(n-1, aux, from, to); // n-1 從 aux 借 from 移到 to
}
遞歸三步驟:**分解子問題、解決基例、合併結果**。
scanf("%*d %d", &a, &b):* 抑制賦值,跳過第一個整數。printf("%10d, %-10d"):寬度 10,左對齊/右對齊。printf("%08d"):不足 8 位左補 0。printf("%0*d", 8, 100):動態寬度補 0。printf("%.2f"):保留 2 位小數。int *p = malloc(sizeof(int)); *p = 10; free(p); char *s = malloc(1024); strcpy(s, "heap string"); free(s); struct Data *d = malloc(sizeof(*d)); d->a = 1; d->b = 2.0; free(d); // 數組 int *arr = malloc(10 * sizeof(int)); for (int i=0; i<10; i++) arr[i] = i+1; free(arr);
**鐵律**:每個 malloc 必配 free,防洩漏。
time_t t = time(NULL);
struct tm *lt = localtime(&t);
printf("%d-%02d-%02d %02d:%02d:%02d\n",
1900+lt->tm_year, lt->tm_mon+1, lt->tm_mday,
lt->tm_hour, lt->tm_min, lt->tm_sec);
| 模式 | 含義 |
|---|---|
| r | 只讀,文件必須存在 |
| w | 只寫,截斷/創建 |
| a | 追加寫,創建 |
| r+/w+/a+ | 讀寫,對應 r/w/a 基礎上可讀 |
| +b | 二進制模式(Windows 區分換行轉換) |
FILE *fp = fopen("data.txt", "w");
fprintf(fp, "%c %d %f %lf\n", 'a', 10, 12.34f, 12345.6789);
fclose(fp);
fp = fopen("data.txt", "r");
char c; int i; float f; double d;
fscanf(fp, "%c %d %f %lf", &c, &i, &f, &d);
fclose(fp);
struct Student { int id; char name[20]; char addr[200]; };
struct Student s = {10000, "zhangsan", "江蘇南京"};
FILE *fp = fopen("stu.bin", "wb");
fwrite(&s, sizeof(s), 1, fp);
fclose(fp);
fp = fopen("stu.bin", "rb");
struct Student r;
fread(&r, sizeof(r), 1, fp);
fclose(fp);
fseek(fp, 0, SEEK_SET); // 文件開頭 fseek(fp, 5, SEEK_CUR); // 當前位置 +5 fseek(fp, -10, SEEK_END); // 文件末尾 -10 long pos = ftell(fp); // 獲取位置
FILE *src = fopen("src.txt", "r");
FILE *dst = fopen("dst.txt", "w");
int ch;
while ((ch = getc(src)) != EOF) putc(ch, dst);
fclose(src); fclose(dst);
#includeint max(int cnt, ...) { va_list ap; va_start(ap, cnt); int m = va_arg(ap, int); for (int i=1; i m) m = v; } va_end(ap); return m; } // 調用:max(5, 10, 20, 5, 30, 15) → 30
char buf[100];
sprintf(buf, "len=%lu, str=%s", strlen("abc"), "abc"); // 寫入字符串
sscanf(buf, "len=%d, str=%s", &len, str); // 從字符串解析
本文涵蓋 C 語言函數機制(定義、聲明、參數傳遞、返回/退出)、遞歸與遞推核心模式(階乘、斐波那契、漢諾塔)、標準庫進階用法(格式化細節、動態內存、時間、文件 IO、可變參數、字符串格式化)。掌握「值傳遞本質、遞歸基例與分解、malloc/free 配對、文件模式選擇、va_list 參數遍歷」等核心概念,構建扎實的 C 語言工程基礎。