【问题标题】:How do I fix warning: assignment from incompatible pointer type?如何修复警告:来自不兼容指针类型的赋值?
【发布时间】:2023-04-03 21:57:01
【问题描述】:

我想问如何摆脱不兼容指针类型赋值的警告。
这是我使用的代码:

#include<stdio.h>

int main()
{
    int a2d[2][2]={{1,2},{3,4}};
    int **pa;
    pa=a2d;
}

得到这个:

7:5: warning: assignment from incompatible pointer type pa=a2d;

【问题讨论】:

  • 数组不是指针。指针不是数组。
  • 平心而论,一维数组和指针是可互操作的。但这对于 2 维或更多维数组不再适用
  • int** 类型的指针必须指向int* 类型的对象。在您的程序中没有int* 类型的对象。 a2d 是一个int[2][2] 类型的对象,由两个int[2] 类型的对象组成,每个对象都由两个int 类型的对象组成。您可以从其中的每一个中派生指针,但没有int* 指针对象,除非您定义它们。

标签: c arrays pointers


【解决方案1】:

当这个

 pa=a2d;

执行,编译器发出警告/错误(取决于您是否使用-Werror

main.cpp:7:8: error: cannot convert 'int [2][2]' to 'int**' in assignment

    7 |     pa=a2d;

      |        ^~~

      |        |

      |        int [2][2]

这个错误是有效的,因为a2d是二维数组,并不代表它是int**类型,类似于数组不是指针的概念强>。

为了使事情正常工作,pa 应该是指向数组的指针,而不是双指针 int**。例如

int a2d[2][2]={{1,2},{3,4}};
int (*pa)[2] = a2d; /* pa is pointer to an array */

这里pa 可以一次指向2 元素,即pa 指向a2d[0] 基地址,pa+1 将指向a2d[1] 基地址。

【讨论】:

  • 这个“修复”可能会让代码编译,但不会让它工作。类型不兼容,告诉编译器假装它们不兼容。
  • 是的@PeteBecker,你是对的。只是为了消除警告,我建议显式类型转换。
  • 目标不是删除警告。就是写出能正常工作的代码。
【解决方案2】:

您可能希望将二维数组衰减为指向数组元素的指针数组。在这种情况下:

int a2d[2][2] = { { 1,2 },{ 3,4 } };
int (*pa)[2] = a2d;

访问 4:

printf("%d\n", pa[1][1]);

【讨论】:

    【解决方案3】:

    您的分配错误,您无法将二维数组解析为指向指针的指针。 你的代码应该是这样的:

    #include<stdio.h>
    
    int main()
    {
        int a2d[2][2]={{1,2},{3,4}};
        int * pa;
        pa=&a2d[0][0];
    }
    

    因为二维数组不是双指针。但这有效:

    #include<stdio.h>
    
    int main()
    {
        int ad[2]={4,5};
        int * pa;
        pa=ad;
    }
    

    但它正在传递它的地址。但如果你写:

        int a2d[2][2]={{1,2},{3,4}};
        int ** pa;
        pa=a2d;
    

    它将二维数组的地址传递给双指针...

    【讨论】:

      猜你喜欢
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 2011-06-21
      • 2013-05-26
      • 2019-08-09
      相关资源
      最近更新 更多