c - 将 3D 数组的 3 个基本 block 地址的基地址存储到数组指针中?

标签 c pointers

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/

相关文章:

C++获取字节数组中字符串后的短数字

c - 来自不兼容指针类型警告的初始化。找不到问题

c - 获取接收到的数据包的实际大小

c - 这个指针示例如何不产生错误?

c - 在 C 中从 stdin 读取行到二维数组而不知道行的长度

C - 单步执行结构指针的问题

c++ - 为二维char数组分配内存,错误: invalid conversion from ‘void*’ to ‘char**’

c - 索引内存指针数组与 ANSI C 中的间接整数索引数组

c - 请告诉我为什么这个条件总是正确的

c - 我想在我的程序中创建一个死锁,但它不起作用(C、fork、并行编程)