簡體   English   中英

帶有二維數組的 C 指針

[英]C pointer with 2D array

我正在學習 C 語言,我對二維數組指針感到困惑。

我有以下聲明

int a[3][5];
int *b[3][3];
int (*c)[3][5];
int *(d[3][5]);
int (*e[3])[5];

誰能幫我澄清一下

  1. 是否有有效的聲明
  2. a,b,c,d,e 的大小(假設在 64 位機器上,地址 id 8 字節)
  3. 他們指的是什么
  4. 如何訪問二維數組中的元素

我對 2D 數組中指針的使用完全感到困惑.....我想其中一些是等效的...但有些可能不是好的做法

這些

int a[3][5];
int *b[3][5];

(我認為您的意思確實是int *b[3][5]而不是int *b[3][3]因為它是在您的問題中寫的)二維數組的兩個聲明。

第一個數組的元素具有int類型。 第二個數組的元素具有int *類型。

要訪問數組的元素,您可以使用例如下標

a[i][j]b[i][j]其中i[0,3)范圍內的索引, j是 [0, 5) 范圍內的索引。

對於訪問數組元素指向的對象的第二個數組,您可以使用像*b[i][j]這樣的表達式

sizeof( a )等於3 * sizeof( int[5] )又等於3 * 5 * sizeof( int )

sizeof( b )等於3 * sizeof( int *[5] )又等於3 * 5 * sizeof( int *)

這個

int (*c)[3][5];

是指向int[3][5]類型的二維數組的指針的聲明。 你可以寫例如

int (*c)[3][5] = &a;

其中a是上面聲明的二維數組。

要訪問指向數組的元素,您可以使用此語法

( *c )[i][j]

這個

int *(d[3][5]);

二維數組元素的聲明,其類型為int * 此聲明等效於上面顯示的聲明,即

int *b[3][5];

您可以將聲明符括在括號中。 所以,你甚至可以寫數組的聲明d

int * (((d)[3])[5]);

這個

int (*e[3])[5];

是一個數組的聲明,其中包含 3 個指向int[5]類型數組的指針元素。 使用 typedef

typedef int T[5]; 

數組聲明可以像這樣重寫

T * e[3];

這是一個演示程序,顯示如何訪問數組e元素。

#include <stdio.h>

int main( void )
{
    int a1[5] = { 1, 2, 3, 4, 5 };
    int a2[5] = { 10, 20, 30, 40, 50 };
    int a3[5] = { 100, 200, 300, 400, 500 };

    int(*e[3])[5] = { &a1, &a2, &a3 };

    for (size_t i = 0; i < sizeof( e ) / sizeof( *e ); i++)
    {
        for (int j = 0; j < sizeof(*e[i]) / sizeof(**e[i]); j++)
        {
            printf( "%3d ", ( *e[i] )[j] );
        }
        putchar( '\n' );
    }

    return 0;
}

程序輸出是

  1   2   3   4   5
 10  20  30  40  50
100 200 300 400 500

暫無
暫無

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

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