[英]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];
誰能幫我澄清一下
我對 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.