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

C語言指標核心觀念:記憶體位址、解參考、陣列關係與操作精要

     編輯:關於C

指標本質:位址的容器

指標變數儲存的是記憶體位址。透過此位址,程式可存取該記憶體位置的資料。指標型別決定了解參考時如何解讀位址處的位元組(如 `int*` 讀 4 位元組,`char*` 讀 1 位元組)。

宣告與初始化

int *p1;        // 指向 int 的指標
char *p2;       // 指向 char 的指標
int a = 123;
int *p3 = &a;   // 取址運算子 & 取得變數位址
int *p4; p4 = &a; // 分開宣告與指派

核心操作:解參考 *

int a = 12;
int *p = &a;
int b = *p;     // *p 取得 p 指向位址的值(12)
*p = 20;        // 修改 p 指向位址的值,a 變為 20

指標與陣列:深度綁定

  • 陣列名 `arr` 在大多數語境下轉換為**指向首元素的指標常數**(`int *const`)。
  • `arr[i]` 等價於 `*(arr + i)`,編譯器自動處理型別大小的位移。
  • 指標算術:`p + 1` 移動 `sizeof(*p)` 位元組。
int arr[5] = {1,2,3,4,5};
printf("%d\n", arr[0]); // 1
printf("%d\n", *arr);   // 1,等價 *(arr+0)
printf("%d\n", *(arr+2)); // 3,等價 arr[2]

指標型別的意義

型別解參考大小算術步長典型用途
`char *`1 byte1字串、位元組操作
`int *`4 bytes4整數陣列
`double *`8 bytes8浮點數陣列
`void *`不可解參考1 (GNU 延伸)泛型指標、記憶體分配
`int **`指標大小指標大小二維陣列、修改指標值

常見指標模式

1. 函式修改呼叫端變數(傳址呼叫模擬)

void swap(int *a, int *b) {
    int tmp = *a; *a = *b; *b = tmp;
}
int main() { int x=1,y=2; swap(&x,&y); }

2. 動態記憶體分配

int *arr = malloc(n * sizeof(int));
if (arr) { /* 使用 */ free(arr); }

3. 字串處理

char *str = "hello"; // 指向唯讀區字串常值
char buf[100]; strcpy(buf, str); // 複製到可寫緩衝區

4. 函式指標

int add(int a, int b) { return a+b; }
int (*func_ptr)(int,int) = add;
func_ptr(3,4); // 7

危險操作與防禦

風險後果防禦
野指標(未初始化)隨機存取,崩潰/靜默錯誤宣告即初始化 `= NULL` 或 `= &var`
懸空指標(free 後未置 NULL)Use-after-free,未定義行為`free(p); p = NULL;`
緩衝區溢位覆蓋相鄰記憶體,安全漏洞使用 `strncpy`、`snprintf`、邊界檢查
型別懲罰違反 strict aliasing,優化器誤編譯避免 `float*` 轉 `int*` 存取同一記憶體

const 與指標組合(重溫)

const int *p1;       // *p1 唯讀
int *const p2 = &x;  // p2 唯讀(常數指標)
const int *const p3 = &x; // 兩者唯讀

總結

指標是 C 語言的靈魂:**位址運算賦予了對記憶體的絕對控制力**。精通指標需內化三大核心:

  1. 型別決定解讀方式與算術步長
  2. 陣列名退化為指標,下標運算本質是指標算術
  3. 生命週期管理:誰分配誰釋放,釋放即置 NULL

建議多畫記憶體圖(箭頭圖)追蹤指標變化,將抽象符號轉化為具體視覺模型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved