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

C 語言指標訪問陣列:核心機制與實戰應用

     編輯:關於C語言

指標與陣列的等價關係

若指標 pa 指向陣列元素 a[0],則:

  • pa + 1 指向 a[1]
  • pa + i 指向 a[i]
  • *pa 等價於 a[0]
  • *(pa + i) 等價於 a[i]

C 語言編譯器內部正是透過指標運算實現下標訪問:a[i] 在編譯期轉換為 *(a + i)。因此下標與指標在語義上完全等價。

實戰範例:指標遍歷陣列

int score[10] = {76, 85, 90, 67, 59, 79, 82, 95, 91, 65};
int length = sizeof(score) / sizeof(score[0]);

for (int i = 0; i < length; i++) {
    printf("%d\n", *(score + i));  // 陣列名 score 即首元素地址
}

輸出:76 85 90 67 59 79 82 95 91 65

陣列名作為函數參數的本質

將陣列名傳給函數時,實際傳遞的是首元素地址。因此函數參數必須聲明為指標:

// 以下三種聲明等價
void func(int *arr);
void func(int arr[]);
void func(int arr[10]);  // 10 被忽視,退化為指標

函數內部無法獲知陣列長度,必須額外傳遞長度參數。

經典應用:字串長度計算

int strlen(char *s) {
    int n;
    for (n = 0; *s != '\0'; s++)
        n++;
    return n;
}

關鍵點:

  • s 是指標變數,可合法自增(s++)
  • 若改用陣列參數 char s[],則 s++ 非法(陣列名非常量指標)
  • 此寫法展現指標作為「游標」遍歷記憶體的優雅性

進階理解:指標算術與類型

指標加減運算的步長由指向類型大小決定:

  • int *p:p+1 增加 sizeof(int) 位元組
  • char *p:p+1 增加 1 位元組
  • double (*p)[5]:p+1 增加 5*sizeof(double) 位元組

這正是 *(a + i) 能正確定位第 i 個元素的根本原因。

常見誤區澄清

誤區正確理解
陣列名就是指標陣列名是常量指標,不可修改;指標是變數
函數接收陣列參數能用 sizeof 求長度參數退化為指標,sizeof 只得指標大小(4/8 位元組)
指標自增是加 1 位元組步長 = 指向類型大小
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved