我正在学习C语言,我对2D数组指针感到困惑。
我有以下声明
int a[3][5];
int *b[3][3];
int (*c)[3][5];
int *(d[3][5]);
int (*e[3])[5];
任何人都可以帮我澄清
我对2D数组中指针的使用感到困惑.....我想其中一些是等价的......但有些可能不是很好的做法
答案 0 :(得分:2)
这些
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]范围内的索引。< / p>
对于第二个访问数组元素所指向对象的数组,可以使用*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];
的声明,如
int[5]
此
typedef int T[5];
是一个数组的声明,其中包含3个指向T * e[3];
类型数组的指针元素。
使用typedef
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
的元素。
{
"ev": "pageview",
"visitor" :"blah",
"route": "/my-route",
"title":"My route",
"desc" foo bar"
}
程序输出
GET /{YOUR_INDEX}/_search
{
"query": {"match_all": {}},
"aggs": {
"page_views": {
"terms": {
"field": "route",
"size": 100
}
}
}
}