3D 数组的每个元素都是 2D 数组。声明 3D 数组后,a 将被视为指向数组第零个元素的指针。因此 a[0] 即 *(a+0) 或 *a 给出第零个元素,它是一个二维数组。我们知道,在提及二维数组时,我们会得到它的基地址。所以我想将第 0、第 1 和第 2 个二维数组基地址的基地址存储到数组指针 ptr1,但是因为我在每个 ptr1[0]、ptr1[1]、ptr1 中存储了 3 个 int block 的地址[2],我需要对它进行类型转换,但我不知道如何?
问题是 int *ptr1[3]={a[0],a[1],a[2]}; 中的类型转换。 我得到的错误是:
cannot convert 'int ()[3]' to 'int' in initialization
#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;
}
最佳答案
这很可怕,但是这段代码可以干净利落地编译并正常运行:
#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]);
关于c - 将 3D 数组的 3 个基本 block 地址的基地址存储到数组指针中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26154754/