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

C指標深度解析(三):指標與陣列的本質關係

     編輯:關於C語言

指標與陣列:千絲萬縷的「非」關係

C 語言中指標與陣列常被誤以為等價,實則「指標是指標,陣列是陣列,兩者本質不同」。為何常見 int *p = array; 這樣的代碼?本質只有一點:陣列名是指向首元素的常量指標——這是兩者唯一聯繫。

為何 p[i] 能訪問陣列元素?

編譯器將 p[i] 解釋為 *(p + i),這純粹是指標運算。p[i] 只是語法糖,讓人類閱讀更舒適,對編譯器無意義差異。

實驗一:函數參數中的陣列退化為指標

void fun(int *array) {
    printf(" sizeof(array)...%zu\n", sizeof(array));  // 輸出指標大小(4或8)
}

int main() {
    int array[] = {1, 2, 3, 4, 5};
    printf(" sizeof(array)...%zu\n", sizeof(array));  // 輸出 20 (5*4)
    fun(array);
    return 0;
}

結果揭示: 傳遞陣列實為傳遞首元素位址。原因有二:
1. 效率:複製整個陣列耗時耗空間
2. C 設計初期賦值僅限基本類型,陣列屬聚合類型

啟示: 傳遞陣列時必須同時傳遞大小,否則函數內無法知邊界,極易越界。函數簽名應設計為 void fun(int *array, int n)。即便寫成 void fun(int array[], int n) 或 void fun(int array[5], int n),參數仍被視為指標,長度資訊被編譯器忽略。

實驗二:array 與 &array 的類型差異

int main() {
    int array[] = {1, 2};
    printf(" array...%p\n", array);      // 0031FCEC
    printf(" &array...%p\n", &array);    // 0031FCEC
    printf(" &array+1...%p\n", &array+1); // 0031FCF4 (差值 8 = sizeof(array))
    return 0;
}

結論:

  • array 類型:int *,指向首個 int
  • &array 類型:int (*)[2],指向含 2 個 int 的陣列(陣列指標)
  • 兩者數值相同(首址),但指標運算步長不同:array+1 增 4 位元組,&array+1 增 8 位元組

為何 int(*)[2] 表示陣列指標?

需透徹理解 C 宣告語法(右左規則),後續章節將詳細講解。掌握此點對理解多維陣列、函數指標、複雜宣告至關重要。

總結

  1. 僅在函數形參中,宣告的陣列 int array[] 被視為指標
  2. 其他場合指標與陣列無直接關係
  3. array 是首元素指標,&array 是整個陣列指標,類型不同、步長不同
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved