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

C 語言指標入門圖解:從記憶體佈局到指標運算、陣列、字串與函數傳遞

     編輯:關於C語言

指標三要素

  • 類型:決定解參考時讀取多少位元組(int* 讀 4B,char* 讀 1B)
  • 值:儲存的記憶體位址(32 位系統 4B,64 位 8B)
  • 本身位址:指標變數自己在堆疊的位置 &p

核心運算子

運算子意義範例
&取址int *p = &a;
*解參考(取值/存值)*p = 20;
p+i指標算術,按類型大小位移p+1 向後移 sizeof(*p) 位元組

指標與陣列

  • arr 退化為首元素位址 &arr[0],但 arr 是**常量指標**,不可賦值
  • int *p = arr; 後,p[i] ≡ *(p+i) ≡ arr[i]
  • 指標類型不匹配(int* 指向 char)會導致解參考讀取錯誤位元組數

字串與指標

char *s = "iPhone";  // s 指向常數區,不可修改內容
s[2] = 'z';          // 錯誤:Segment Fault
char arr[] = "iPhone"; // arr 在堆疊,可修改
arr[2] = 'z';        // OK

指標陣列與二級指標

char *strs[3] = {"iPhone", "Android", "Win8"}; // 指標陣列
char **p = strs;                                // 二級指標
printf("%s", p[1]);        // "Android"
printf("%c", p[1][4]);     // 'o'
printf("%c", *(p[1]+4));   // 'o'

函數傳遞:值傳遞 vs 指標傳遞

void swap_val(int x, int y) { int t=x; x=y; y=t; } // 無效,改的是副本
void swap_ptr(int *x, int *y) { int t=*x; *x=*y; *y=t; } // 有效
swap_ptr(&a, &b); // 必須傳址

實戰建議

  1. 畫記憶體圖:方框代表位元組,箭頭代表指向
  2. 區分「指標變數本身」與「指向的資料」
  3. 函數參數若需修改呼叫端變數,**必須傳址**
指標記憶體圖1 指標記憶體圖2 指標運算示意 陣列與指標關係 字串常數區vs堆疊 指標陣列佈局 二級指標示意 函數傳值vs傳址 swap 執行前後堆疊 指標類型不匹配 多維陣列指標 指標函數參數 綜合練習圖解 指標總結1 指標總結2 指標總結3
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved