这些
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]
This
int *(d[3][5]);
声明一个二维数组,其元素具有类型
int *
。
这个声明与上面显示的声明是等价的。
int *b[3][5];
您可以将声明符括在括号中。因此,您甚至可以像这样编写数组d
的声明:
int * (((d)[3])[5]);
This
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
rows
数个1D数组的数组。int *b [3] [3]
是指向类型为int
的指针的2D数组。int (*c) [3] [5]
是指向3x5个int
数组的指针。int *(d[3][5])
与*d[3][5]
相同,而int (*e[3])[5]
是指向3个int
(其中每个有5个)的指针数组。 - David C. Rankind
与b相同(除了3和5)-括号没有影响,e
是一个包含3个指针的数组,这些指针指向包含5个整数的数组。特别地,sizeof(e)为3*8 = 24。 - Tom Karzes