2026年1月11日 星期日

C語言:使用多重指標來存取 int 型態四維陣列的範例

本篇文章將透過一個實例,說明如何使用多重指標來存取一個四維陣列。首先,我們初始化一個大小為 2x2x2x3 的 int 型態四維陣列 a , 接著宣告並賦值值一個多重指標來指向它。範例程式碼如下 :
#include <stdio.h>

int main() {
int a[2][2][2][3] = {{{{90,36,54},{70,31,51}},{{12,42,102},{8,13,53}}},{{{129,14,64},{16,1,60}},{{32,22,12},{8,13,61}}}}; // 初始化一個四維陣列 a
    // 宣告一系列指標陣列與多重指標變數
int *ptr1[2][2][2] ; // 指標三維陣列
int **ptr2[2][2] ; // 指標二維陣列
int ***ptr3[2] ; // 指標陣列
int ****ptr4 ; // 多重指標變數

// 建立指標之間的連結
ptr4 = ptr3 ;

ptr3[0] = &ptr2[0][0] ;
ptr2[0][0] = &ptr1[0][0][0] ;
ptr2[0][1] = &ptr1[0][1][0] ;

ptr3[1] = &ptr2[1][0];
ptr2[1][0] = &ptr1[1][0][0] ;
ptr2[1][1] = &ptr1[1][1][0] ;

// 將 ptr1 指向四維陣列 a 的各個三維子陣列
ptr1[0][0][0] = a[0][0][0] ;
ptr1[0][0][1] = a[0][0][1] ;
ptr1[0][1][0] = a[0][1][0] ;
ptr1[0][1][1] = a[0][1][1] ;
ptr1[1][0][0] = a[1][0][0] ;
ptr1[1][0][1] = a[1][0][1] ;
ptr1[1][1][0] = a[1][1][0] ;
ptr1[1][1][1] = a[1][1][1] ;

// 現在可以使用多重指標 ptr4 來操作四維陣列 a
printf ( "ptr4 存取的值:%d\n", *(*(*(*(ptr4+1)+1)+1)+2)) ; // 應輸出 61

// 另一種更常見的指標存取方式
int (*ptr6)[2][2][3] = a;

printf ( "ptr6 存取的值:%d\n", *(*(*(*(ptr6+1)+1)+1)+2)) ; // 應輸出 61

     return 0;
}

結論:
int ****ptr4 是一個指向整數指標的指標的指標的指標 (a pointer to a pointer to a pointer to a pointer to an integer)。而 int (*ptr6)[2][2][3] 是一個指向三維陣列的指標 (a pointer to a 2x2x3 array of integers)。
簡而言之,ptr4 儲存的是位址,這個位址指向另一個儲存位址的變數。而 ptr6 儲存的是一個陣列的起始位址。ptr4 與 ptr6 這兩種指標的遞增行為(也就是 [] 運算子)是完全不同的。所以我們可以觀察到 printf("%p",ptr4[1][1]) 和 printf("%p",ptr6[1][1]) 的結果不一致。而 printf("%p",ptr6[1][1]) 和 printf("%p",a[1][1]) 的結果一致。

ptr4 與 ptr6 在存取元素值為 int 數值的時候,ptr4 透過多個指標變數層層跳轉來找到最終的 int 值。而 ptr6 則是在單一指標上直接進行位址算術,這是它們最根本的區別



沒有留言:

張貼留言