将3D阵列的3个基本块地址的基址存储到数组指针中?

时间:2014-10-02 05:05:55

标签: c pointers

3D阵列的每个元素都是2D数组。声明3D数组后,将a视为指向数组的第0个元素的指针。因此,[0]即*(a + 0)或* a给出作为2D阵列的第零个元素。我们知道在提到2D数组时,我们得到它的基地址。所以我想将第0,第1和第2个2D数组基地址的基地址存储到数组指针ptr1,但由于我在每个ptr1 [0],ptr1 [1],ptr1中存储3个int的块的地址[2],我需要对它进行类型转换,但我不知道怎么做?

问题是int * ptr1中的类型转换[3] = {a [0],a [1],a [2]};。 我得到的错误是:

  

无法在初始化中将'int()[3]'转换为'int '

#include <stdio.h>

int main()
{
    static int a[3][3][3]={{1,2,3,4,5,6,7,8,9},
                          {2,4,6,8,10,12,14,16,18},
                          {3,6,9,12,15,18,21,24,27}};                                
    static int* ptr[]={
                       a[0][0],a[0][1],a[0][2],
                       a[1][0],a[1][1],a[1][2],
                       a[2][0],a[2][1],a[2][2]};
    int *ptr1[3]={a[0],a[1],a[2]};
        printf("\n");
    for(i=0;i<=8;i++)
    {
        printf("%d\n",*ptr2);
        ptr2++;

    }

    printf("\n");

    for(i=0;i<=2;i++)
    {
        printf("%d",*(ptr1[i]));
    }


    printf("\n");

    for(i=0;i<=8;i++)
    {
        printf("%d",*ptr[i]);
    }
    return 0;
}

1 个答案:

答案 0 :(得分:2)

这很可怕,但是这段代码干净利落地运行并且运行良好:

#include <stdio.h>

int main(void)
{
    static int a[3][3][3] =
    {
        { { 1, 2, 3, }, {  4,  5,  6, }, {  7,  8,  9, }, },
        { { 2, 4, 6, }, {  8, 10, 12, }, { 14, 16, 18, }, },
        { { 3, 6, 9, }, { 12, 15, 18, }, { 21, 24, 27, }, },
    };
    static int *ptr[] =
    {
        a[0][0], a[0][1], a[0][2],
        a[1][0], a[1][1], a[1][2],
        a[2][0], a[2][1], a[2][2],
    };
    int (*ptr1[3])[] =  // an array of 3 pointers to arrays of int
    {
        a[0], a[1], a[2],
    };
    int **ptr2 = ptr;

    for (int i = 0; i < 9; i++)
    {
        printf("%d\n", (*ptr2)[0]);
        ptr2++;
    }

    for (int i = 0; i < 3; i++)
    {
        printf("%d\n", (*ptr1[i])[0]);
    }

    return 0;
}

输出:

1
4
7
2
8
14
3
12
21
1
2
3

汇编:

gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
    -Wold-style-definition -Werror mess.c -o mess

有趣的怪癖:您可以为ptr1编写以下任何声明,并获得干净的工作代码:

int (*ptr1a[ ])[3] = { a[0], a[1], a[2], };
int (*ptr1b[3])[3] = { a[0], a[1], a[2], };
int (*ptr1c[3])[ ] = { a[0], a[1], a[2], };
for (int i = 0; i < 3; i++)
    printf("%d = %d = %d\n", (*ptr1a[i])[0], (*ptr1b[i])[0], (*ptr1c[i])[0]);