匯東網


C 語言的數組指針問題

[編輯] [转简体]
|
作者:huidong | 分類:【編程】C/C++
[ 9 瀏覽 0 評論 1 贊 3 踩 ]

概要

正文

首先明確:

  1. 指針就是一個存放地址的變量,它的核心要素就是:地址在哪?讀取多長(指針類型)?

    後者由指針的類型決定,如果是 int* 每次就讀取 sizeof(int) 這麼長,如果是 int[3]* 每次就讀取 sizeof(int[3]) 這麼長,多維數組以此類推。

  2. 數組的名稱就是其首元素地址的代號。

    對於 int A[2][2][2],那麼 A 和 A[0] 和 A[0][0] 都是指針(A[0][0][0] 則是 int 型元素)。從地址來看,它們都一樣;從類型來看,他們分別是 int[2][2][2],int[2][2],int[2] 類型,在進行地址加減運算的時候,跨度不同。

因此,數組指針就很簡單了。如果我們想定義一個指針指向 A,那麼這個指針應該存儲 A 的地址,同時是 int[2][2]* 類型。要把這樣一個指針定義出來,應當如何寫呢?

int* pp[2][2] = A;    // 錯誤(等價於 int* (pp[2][2]) = A;)
// 因爲在定義變量的時候 [] 的優先級更高,因此這句話被解釋爲:
// 我需要定義一個 [2][2] 的數組,數組的每個元素的類型是 int*

int (*pp)[2][2] = A;    // 正確
// 由於括號的優先級最高,因此這句話被解釋爲:
// 我要定義的一個變量 pp 是指針,它指向的元素類型是 int[2][2],也就是這個指針變量的類型是 int[2][2]*


示例:

#include <stdio.h>

int main()
{
    int B[2][2][2] = { 1,2,3,4,5,6,7,8 };
    int(*pp)[2][2] = B, (*p)[2] = (int(*)[2])B;

    // 用 p, pp 讀取 B[i][j][k]
    int i = 0, j = 1, k = 0;
    int ans = B[i][j][k];
    
    int B_1 = *(*(*(B + i) + j) + k);
    
    int pp_1 = (*(pp + i))[j][k];    // 正確,優先級從低到高依次是 +, *, []
    int pp_2 = *(pp + i)[j][k];        // 錯誤,因爲 [] 優先級比 * 高    
    
    int p_1 = *(*(p + i * 2 + j) + k);    // 如果非得用 int(*)[2] 類型幹 int(*)[2][2] 類型的事情,就只好把這個 2 寫死在此處了

    // 上面代碼的運行結果:
    // ans = 3;
    // B_1 = 3;
    // pp_1 = 3;
    // pp_2 = 5;(唯一錯誤結果)
    // p_1 = 3;

    return 0;
}


[ 1] [ 3]


 評論區  0 條評論

+ 添加評論