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

C語言指針進階(五):字符串指針vs數組、函數指針實戰、main參數與指向指針的指針

     編輯:C 語言基礎

字符串指針 vs 字符數組:深度對比

維度字符串指針 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 函數參數:argc / argv

程序啟動時由操作系統從命令行提取參數傳遞給 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 封裝、鏈表頭插入、雙指針鏈表操作)。
  • 指針層級每增加一級,間接訪問深度加一,理解難度指數上升,實際工程極少超過二級。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved