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

C語言核心易混淆知識點總結:指針、函數、字符串與const陷阱

     編輯:關於C

一、指針數組 vs 數組指針

int *p[10];    // 指針數組:含 10 個 int* 元素的數組
int (*p)[10];  // 數組指針:指向「含 10 個 int 的數組」的指針

記憶口訣:`[]` 結合力優於 `*`。`p[10]` 先結合 → 數組;`(*p)[10]` 先結合指針 → 指向數組的指針。

二、函數指針 vs 指針函數


int (*p)(int, int);  // 函數指針:指向「接受兩個 int、返回 int 的函數」
int *max(int, int);  // 指針函數:返回 int* 的函數

區別:前者是指針變量,後者是函數聲明。

三、字符串常量初始化:指針 vs 數組


char *p = "gooseberry";   // 指向只讀區,不可修改內容
char a[] = "gooseberry";  // 棧上分配,可修改內容

實驗驗證:


// 錯誤示範
char *p = "gooseberry";
p[0] = 'G';  // 未定義行為,可能崩潰

// 正確做法
char a[] = "gooseberry";
strncpy(a, "black", 5);  // a 變為 "blackberry"

四、常量指針 vs 指針常量

類型聲明含義可修改指針可修改指向值
常量指針const int *p / int const *p指向常量的指針是否
指針常量int *const p指針本身是常量否(須初始化)是
雙重常量const int *const p指針和指向值均不可修改否否

記憶技巧:從右向左讀

  • `const int *p` → p is a pointer to const int
  • `int *const p` → p is a const pointer to int

五、綜合陷阱案例


void trap_demo() {
    int a = 10, b = 20;
    const int *p1 = &a;   // 常量指針
    int *const p2 = &a;   // 指針常量
    
    p1 = &b;    // ✓ 合法
    *p1 = 30;   // ✗ 非法
    
    p2 = &b;    // ✗ 非法
    *p2 = 30;   // ✓ 合法
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved