字符串字面量存儲在只讀數據段,類型為 const char[],退化為 const char*。指針算術可直接偏移:
printf("%s", "abcdefgh" + 2); // 輸出 "cdefgh"
// 等價於
const char *p = "abcdefgh";
printf("%s", p + 2);
注意:不可修改字符串常量內容,會導致未定義行為(段錯誤)。
返回類型 (*指針變量名)(參數列表);
int add(int a, int b) { return a + b; }
int main() {
int (*myfunc)(int, int); // 聲明
myfunc = add; // 賦值(函數名隱式轉指針)
int x = myfunc(12, 36); // 調用
printf("%d\n", x); // 48
return 0;
}
int (*ops[])(int, int) = { add, sub, mul, div };
// 調用:ops[0](3, 4) → 7
main 簽名int main(int argc, char **argv) int main(int argc, char *argv[]) // 等價
argc:參數個數,含程序名本身,最小為 1。argv[0]:程序名(含路徑)。argv[argc] 保證為 NULL。while (*++argv != NULL)
printf("%s\n", *argv);
#include <stdio.h>
#include <stdlib.h>
int add(int a,int b){ return a+b; }
int sub(int a,int b){ return a-b; }
int main(int argc, char **argv) {
int (*ops[])(int,int) = { add, sub };
int op = atoi(*++argv); // 第一個參數:操作碼 0/1
int result = 0;
while (*++argv != NULL) { // 後續參數:操作數
int val = atoi(*argv);
result = ops[op](result, val);
}
printf("%d\n", result);
return 0;
}
// 測試:
// ./calc 0 1 13 52 → 66 (add)
// ./calc 1 1 13 52 → -66 (sub)
| 主題 | 關鍵點 |
|---|---|
| 字符串常量 | 只讀、指針算術偏移、不可修改 |
| 函數指針聲明 | 返回類型 (*名)(參數) |
| 函數指針賦值 | 函數名、&函數名 均可 |
| 函數指針調用 | *fp()、fp() 等價 |
| argc/argv | argc≥1,argv[argc]==NULL |
| argv 遍歷 | while(*++argv) 跳過程序名 |