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

C/C++ 指標進階:int(*p)[] 與 int(**p)[] 的型別差異與實戰應用

     編輯:更多程式設計知識

指標宣告中的括號決定結合優先序,int(*p)[] 與 int(**p)[] 雖長相似,語意卻截然不同。本文以運算子優先序剖析型別結構,附矩陣操作實例。

型別剖析

宣告優先序分析語意相容型別
int (*p)[10]() 最高 → p 是指標 → 指向 int[10]指向「10 個 int 的陣列」的指標(列指標)int arr[3][10] 的列:arr、arr+1
int (**p)[10]() → *p 是指標 → 指向 int[10] 的指標指向「列指標」的指標(指向列指標的指標)&arr(其中 arr 為 int(*)[10])

實例:二維陣列操作

int a[2][2] = {{1,2},{3,4}};

// 1. 列指標遍歷
int (*p)[2] = a; // p 指向第 0 列
for (int i = 0; i < 2; i++)
    for (int j = 0; j < 2; j++)
        cout << *(*(p+i) + j) << ' '; // *(p+i) 為第 i 列首址

// 2. 指向列指標的指標
int (**q)[2] = &p; // q 指向 p
for (int i = 0; i < 2; i++)
    for (int j = 0; j < 2; j++)
        cout << *(*(*q + i) + j) << ' '; // *q 即 p

記憶體佈局對應

a[2][2] 記憶體:[1][2][3][4] 連續分佈
p = a       → p 指向 [1][2] 開頭
p+1         → 指向 [3][4] 開頭(跨越 2*sizeof(int))
q = &p      → q 指向變數 p 本身
*q          → 等價 p

實務應用場景

  • int (*p)[N]:函數參數接收固定列數的二維陣列 void func(int (*mat)[N], int rows)
  • int (**p)[N]:需修改呼叫端的列指標變數(如動態配置矩陣並回傳指標陣列)
  • 動態配置連續二維陣列時,回傳 int(*)[N] 而非 int**,保持連續性

右左法則快速讀法

  1. 從變數名開始向右讀到結束
  2. 向左讀到左括號或開頭
  3. 重複直到結束

例:int (**p)[10] → p → 是指標 → 指向 → 陣列 10 個 → int → 指標 → 指向 → int

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