【问题标题】:Store the base address of 3 basic blocks address of a 3D array into an array pointer?将3D数组的3个基本块地址的基地址存储到数组指针中?
【发布时间】:2014-10-02 05:05:54
【问题描述】:

3D 数组的每个元素都是一个 2D 数组。声明 3D 数组后,将 a 视为指向数组第零元素的指针。因此 a[0] 即 *(a+0) 或 *a 给出第零个元素,它是一个二维数组。我们知道,在提到二维数组时,我们会得到它的基地址。所以我想将第 0、第 1 和第 2 个二维数组基地址的基地址存储到数组指针 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;
}

【问题讨论】:

  • 你得到什么错误或不想要的输出?
  • 很明显,您没有向我们展示您正在编译的内容。这个 a[2[0],a[2][1],a[2][2]}; 在第一个 2 之后缺少一个右方括号。int *ptr1[3] 初始化程序中还有一个杂散的开放括号。
  • 有一个左括号,并且 (a) 没有右括号,或者,更相关的是,(b) 不需要左括号。
  • 既然int *ptr[] = { a[0][0], … }; 没问题,那int *ptr1[3] = { a[0], … }; 不可能也可以。初始化器具有不同的类型,但数组具有相同的基本类型(指向int 的指针数组)。您的 printf() 也在尝试打印格式为 int 的指针。
  • 不要显示您不感兴趣的代码。请阅读如何创建 MCVE (How to create a Minimal, Complete, and Verifiable Example?) 或 SSCCE (Short, Self-Contained, Correct Example) — 相同基本思想的两个名称和链接.

标签: c pointers


【解决方案1】:

这很可怕,但是这段代码编译干净并且运行正常:

#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]);

【讨论】:

  • 你能解释一下吗? int (*ptr1[3])[] = { a[0], a[1], a[2], };它代表什么是“指向数组的指针还是只是一个数组指针”
  • @AbhishekWalter see this。 (并将该链接添加到您的书签;它是最方便的工具)。
  • 查看评论:// an array of 3 pointers to arrays of int。这是真正令人毛骨悚然的地方之一。使用它的printf() 是另一个非常可怕的部分。足以让一个有经验的C程序员尖叫着跑!啊啊啊啊啊啊啊啊啊啊!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
相关资源
最近更新 更多