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

C/C++ 指標宣告陷阱:int* p[] 與 int (*p)[] 的本質差異與實戰對應

     編輯:更多程式設計知識

方括號 [] 優先序高於星號 *,導致 int* p[] 與 int (*p)[] 代表完全不同的型別。本文以優先序規則剖析,附動態二維陣列對應關係。

優先序法則

  1. []、()(函數呼叫)最高
  2. * 次之
  3. 型別修飾詞(const 等)最低

型別對照

宣告解讀順序實際型別俗稱
int* p[2]p → [2] → * → intint* [2]:含 2 個 int* 的陣列指標陣列 / 列指標陣列
int (*p)[2]p → * → [2] → intint (*)[2]:指向「2 個 int 陣列」的指標陣列指標 / 列指標

實戰代碼對比

1. 指標陣列:行數固定、列數可變(不連續)

int* p[2];
int a[3] = {1,2,3};
int b[4] = {4,5,6,7};
p[0] = a;  // 指向 a
p[1] = b;  // 指向 b
// p[0][i] 存取 a[i], p[1][j] 存取 b[j]

等價動態配置:

int** arr = new int*[2];
arr[0] = new int[3];
arr[1] = new int[4];

2. 陣列指標:列數固定、行數可變(連續)

int (*p)[2];
int b[3][2] = {{1,2},{3,4},{5,6}};
p = b; // p 指向第 0 列
// p[i][j] 等價 b[i][j],記憶體連續

動態配置連續矩陣:

int (*p)[2] = new int[3][2]; // C++11 支援
// 或
int* flat = new int[3*2];
int (*p)[2] = reinterpret_cast(flat);

記憶體佈局差異

指標陣列 int* p[2]:
p[0] → [1][2][3]     (位址 0x1000)
p[1] → [4][5][6][7]  (位址 0x2000,離散)

陣列指標 int (*p)[2]:
p    → [1][2][3][4][5][6] (位址 0x1000 連續)
p[0] → [1][2]
p[1] → [3][4]
p[2] → [5][6]

選擇指南

  • 需不規則矩陣(每列長度不同)→ int* p[] / int**
  • 需連續記憶體(效能、傳遞給 C API、GPU)→ int (*p)[N] / 一維展開 p[i*N + j]
  • 函數參數接收二維陣列:void func(int (*mat)[COLS], int rows)(列數須為常數)

右左法則速讀

從變數名出發:先右後左,遇括號優先

  • int* p[2]:p → 右[2] → 左* → int = 陣列
  • int (*p)[2]:p → 左* → 右[2] → int = 指標
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved