【问题标题】:Explain why I get: warning assignment from incompatible pointer type解释为什么我得到:来自不兼容指针类型的警告分配
【发布时间】:2016-11-08 20:01:21
【问题描述】:

我正在尝试制作井字游戏,但遇到了警告。我知道代码仍然可以编译,但我想知道为什么会出现这个警告以及我可以做些什么来修复它。

当 p = a 时我收到警告;

void clean(){
    char a[N][N], *p;
    p = a;
    for(int i = 0; i < N; i++){
        for(int j = 0; j < N; j++){
            *p++ = '_';
        }
    }
    display(a);
}
void display(char a[N][N]){
    for(int i = 0; i < N; i++){
        for(int j = 0; j < N; j++){
            printf("%c ", a[i][j]);
        }
        printf("\n");
    }
}

【问题讨论】:

  • pchar * 类型,而 a 在衰减后变成 char (*)[N] 类型的指针。
  • 你会把每个变量声明放在单独的行上;)
  • 数组不是指针。通常,编译器不仅会说“警告:有问题”,还会提供更准确的原因。请参阅How to Ask 并听从建议!
  • 请注意,clean() 正在尝试清除并显示一个本地数组,该数组将在函数返回时被遗忘。
  • @WeatherVane:OP 没有提供足够的上下文,也没有返回数组。我们不知道他的意图。

标签: c arrays pointers


【解决方案1】:

你的clean 函数应该是这样的:

void clean(void){
    char a[N][N];

    for(int i = 0; i < N; i++){
        for(int j = 0; j < N; j++){
            a[i][j] = '_';
        }
    }
    display(a);
}

拥有p 指针绝对没有任何优势,只是您的代码可读性较差。

【讨论】:

  • @WeatherVane 是的,你是对的,但问题不涉及这方面。
  • void clean() 是一个已弃用(自 17 年以来)的旧式签名。应该是原型风格的void clean(void)
  • Michael 我已将该评论移至主要问题。
  • @MichaelWalz 好的,谢谢,但我认为我会使用指针而不是数组的原因是,当用户在 a[2][2] 中输入“x”时,它会更新通过更改指针值。关于如何在没有指针的情况下做到这一点的任何提示
  • @Jackvile 不太明白您所说的它会通过更改指针值来更新 的意思。
【解决方案2】:

a[][] 是一个 n 字符数组,因此 &a 是一个指向 N,N 字符数组的指针。 这与指向单个字符的指针不兼容,因为 p 是指向字符的指针 只是解释

【讨论】:

  • &amp;achar (*)[5][5],即指向二维数组的指针,而不是 char (*)[5]int * 更糟糕,因为它甚至没有更正基本类型。
  • a [5][5] 不是“5 chars”的数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 2014-12-28
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多