簡體   English   中英

指向多維靜態分配數組部分的指針的語法

[英]Syntax for pointer to portion of multi-dimensional statically-allocated array

好的,我有一個靜態分配的多維數組。 我非常想獲得指向它一部分的指針,並使用該指針來訪問它的其余部分。 基本上,我希望能夠執行以下操作:

#include <stdio.h>
#include <string.h>

#define DIM1 4
#define DIM2 4
#define DIM3 8
#define DIM4 64

static char theArray[DIM1][DIM2][DIM3][DIM4] = {0};

int main()
{
    strcpy(theArray[0][0][0], "hello world");

    char** ptr = theArray[0][0];

    printf("%s\n", ptr[0]);

    return 0;
}s

此代碼使用gcc導致此錯誤:

t.c: In function ‘main’:
t.c:17: warning: initialization from incompatible pointer type

char**顯然不是此處使用的正確類型。 我認為這是因為靜態分配的數組在內存中創建為單個塊,而動態分配的數組在內存中分離,每個維都有指向下一個的指針。

但是,您可能已經注意到,這里的維數非常大,我顯然需要使用實際變量來對數組進行索引,而不是使用漂亮的苗條字符0,因此要很長時間才能進行索引實際代碼中的數組。 我非常想在數組中使用一個指針,這樣訪問數組就不會那么麻煩了。 但是我無法弄清楚正確的語法-如果有的話。 因此,任何幫助將不勝感激。 謝謝。

theArray[0][0]擺脫了前兩個維度,因此您具有類型為char [DIM3][DIM4] 當數組衰減為指針時,第一個維度將丟失,因此所需的聲明為:

char (*ptr)[DIM4] = theArray[0][0];

對於它的價值,gcc還會為您的數組聲明顯示警告:“警告:初始化程序周圍缺少括號”。 靜態變量和全局變量將自動初始化為0,因此您可以通過取消初始化程序來修復警告:

static char theArray[DIM1][DIM2][DIM3][DIM4];

給出聲明

T arr[J][K][L][M];

以下全部成立:

Expression            Type                    Decays to
     ----------            ----                    ---------
            arr            T [J][K][L][M]          T (*)[K][L][M]
           &arr            T (*)[J][K][L][M]
         arr[j]            T [K][L][M]             T (*)[L][M]
        &arr[j]            T (*)[K][L][M]
      arr[j][k]            T [L][M]                T (*)[M];
     &arr[j][k]            T (*)[L][M] 
   arr[j][k][l]            T [M]                   T *
  &arr[j][k][l]            T (*)[M]

因此,在您的情況下, ptr的類型必須為char (*)[DIM4]

如果使用的是Visual Studio,查找表達式類型的一種好方法是使用typeid。

 cout << typeid(&theArray[0][0]).name(); 

哪個打印

字符(*)[8] [64]

但是請注意,typeid()。name()的輸出是特定於實現的行為,因此不能依賴。 但是VS在這方面碰巧是不錯的,它可以打印一個更有意義的名稱

沒關系,它是靜態的,您的類型不匹配

為什么不能將雙指針用作2D數組?

這是一個很好的例子,盡管編譯器可能不會抱怨,但是聲明“ int ** mat”然后將“ mat”用作2D數組是錯誤的。 這是兩種非常不同的數據類型,使用它們可以訪問內存中的不同位置。 在良好的計算機(例如VAX / VMS)上,此錯誤會中止程序,並顯示“內存訪問沖突”錯誤。

這個錯誤很常見,因為很容易忘記不要將衰減約定遞歸地(多次)應用於同一數組,因此2D數組不等同於雙指針。

“指向T的指針”不能用作“ T的2D數組”。 2D數組與“指向T行的指針”“等效”,這與“指向T行的指針”非常不同。

當使用指向下標符號“ ptr [0] [0]”的雙指針指向數組的第一個元素時,它將被完全取消引用兩次(請參閱規則5)。 經過兩次完全解引用后,所得對象的地址將等於在數組的第一個元素內找到的任何值。 由於第一個元素包含我們的數據,因此我們將擁有野生內存訪問權限。 ...

等等... http://www.ibiblio.org/pub/languages/fortran/append-c.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM