带有2D数组的C指针

时间:2017-10-16 21:31:40

标签: c arrays pointers

我正在学习C语言,我对2D数组指针感到困惑。

我有以下声明

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数组中的元素
  5. 我对2D数组中指针的使用感到困惑.....我想其中一些是等价的......但有些可能不是很好的做法

1 个答案:

答案 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
      }
    }
  }
}