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;
}
答案 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]);