| 維度 | 字符串指針 char *ps | 字符數組 char str[] |
|---|---|---|
| 本質 | 指針變量,存地址 | 連續字符集合 |
| 初始化 | char *ps = "abc"; 任意位置合法 | 需靜態/外部:static char str[] = "abc"; |
| 賦值 | ps = "new"; 改變指向 | 不可整體賦值,需 strcpy/逐字符 |
| 修改內容 | 指向字面量時 UB;指向堆/棧可改 | 隨時可改 |
| sizeof | 指針大小 | 數組總字節數 |
| 適用場景 | 只讀字面量、動態字符串、函數參數 | 可修改緩衝區、本地構建字符串 |
// 只讀字面量
const char *msg = "Hello"; // 加 const 防誤改
// 可修改緩衝區
char buf[100];
char *p = buf; // p 指向可寫數組
// 動態分配
char *dyn = malloc(100);
strcpy(dyn, "Hello");
free(dyn);
程序啟動時由操作系統從命令行提取參數傳遞給 main。
int main(int argc, char *argv[])
// 或
int main(int argc, char **argv)
argc:參數個數(含程序名),≥1。argv:字符串指針數組,argv[0] 為程序名,argv[1..argc-1] 為實際參數。argv[argc] 保證為 NULL。
int main(int argc, char *argv[]) {
while (--argc > 0) {
printf("%s\n", *++argv); // 跳過 argv[0]
}
return 0;
}
// 運行:./prog a b c
// 輸出:a b c
#include
int main(int argc, char *argv[]) {
if (argc < 2) return 1;
int n = atoi(*++argv); // argv[1] -> int
int even = 0;
while (n--) printf("%d ", even++ * 2);
return 0;
}
// 運行:./prog 5 -> 0 2 4 6 8
int x = 10;
int *p = &x; // 一級指針
int **pp = &p; // 二級指針,指向 p
printf("%d\n", **pp); // 10
char *langs[] = {"C", "C++", "Java", "Python", "Go"};
char **pp = langs; // pp 指向數組首元素 (char*)
for (int i = 0; i < 5; ++i) {
printf("%s\n", *pp); // 解引用一次得 char*
++pp; // 移動到下一個 char*
}
void allocate(int **ptr, size_t n) {
*ptr = malloc(n * sizeof(int)); // 修改實參指針指向的內存
}
int main() {
int *p = NULL;
allocate(&p, 10); // 傳遞一級指針地址
p[0] = 42;
free(p);
return 0;
}
const 是良習。main(argc, argv) 是程序與外部環境交互的標準接口,argv 本質是 char**。**pp 能間接修改一級指針指向的內存,是輸出型指針參數的核心模式(如 malloc 封裝、鏈表頭插入、雙指針鏈表操作)。