指针赋值的警告消息二维数组指针

时间:2012-04-30 04:12:53

标签: c arrays pointers types

我编写了一个程序来在运行时读取数组元素,然后根据某些配置更改列。

我从GCC cygwin编译器收到以下警告消息:

pointer.c:73: error: incompatible types in assignment

考虑下面的代码,我该如何删除此警告?

提前感谢您的帮助

typedef struct INPUT_ST
{
    float a;
    float b;
    float c;
}INPUT;
const INPUT lookup[3][3];
main()
{
    INPUT *ptr;
    /*typedef INPUT (st[3][3]);*/
    INPUT (*ptr1)[3][3];
    int i, j;
    ptr = (INPUT *)&lookup;
    (*ptr1)[3][3] = &lookup[0][0];

    for(i=0; i<3; i++)
    {
        for(j=0; j<3; j++)
        {
            printf("Row %d and column %d:\n", i, j);
            printf("%f\n", (*ptr1)[i][j].a);
            printf("%f\n", (*ptr1)[i][j].b);
            printf("%f\n\n", (*ptr1)[i][j].c);
        }
        printf("\n");
    }
}

1 个答案:

答案 0 :(得分:1)

导致错误的行如下:

(*ptr1)[3][3] = &lookup[0][0];

原因是作业的左侧和右侧有不兼容的类型。

左侧的

ptr1类型为INPUT (*)[3][3](指向INPUT的3x3数组的指针)。 (*ptr1)[3][3]的类型为INPUT(取消引用(未初始化的)指针,然后访问(越界)元素[3][3])。右侧lookup的类型为const INPUT [3][3]const INPUT的3x3数组)。这使得&lookup[0][0]属于const INPUT *类型(元素[0][0]的地址)。因此类型存在冲突:INPUTconst INPUT *

您真正想要做的是使ptr1指针指向数组lookup。因此,您需要将const添加到指针声明中,然后按如下所示进行初始化:

const INPUT (*ptr1)[3][3];
// ...
ptr1 = &lookup;

您使用ptr的部分解决方案不起作用,因为它是常规指针(单维),因此您无法访问ptr[i][j],这意味着取消引用INPUT不是指针(但可以访问ptr[i*3+j]而不是ptr[i][j])。顺便说一句,您不应像const那样丢弃ptr,而应该将ptr声明为const INPUT *ptr;