【问题标题】:Difference between char* and char[] in C [duplicate]C中char *和char []之间的区别[重复]
【发布时间】:2012-04-07 11:59:15
【问题描述】:

可能重复:
C - Difference between “char var[]” and “char *var”?

我已经编写了以下 C 代码

#include<stdio.h>
int main()
{
    char name[31];
    char *temp;
    int i ;
    scanf("%s",name);
    temp  = name;
    name = temp;

}

编译时出现如下错误

incompatible types when assigning to type 'char[31]' from type 'char *'

数组名是指向第一个元素的指针(这里是字符指针..对吗?)。对吧?上面的代码表示字符数组和char*是不同的类型..是真的吗? 为什么名称的类型!= char * 为什么我不能将另一个 char 指针分配给 char 指针(数组名)

【问题讨论】:

  • 在此处提问之前,请先查看 C 常见问题解答。

标签: c arrays pointers


【解决方案1】:

数组名是指向第一个元素的指针(这里是字符指针..对吗?)。 对吧?

错了。在大多数情况下,数组 decay 指向指向第一个元素的指针,但它们当然不是指针。 C FAQ中有很好的解释,还有一张无价的图片(a是数组,p是指针):

从“char”类型分配给“char[31]”类型时的类型不兼容 *'

在 C 中,数组是不可修改的左值,您无法更改它们所指向的内容,因为它们一开始并不指向任何地方

【讨论】:

  • 好的...得到点数组是不可修改的左值...这意味着我也不能做 char name[31];字符温度[31];诠释我; scanf("%s",name);温度=名称;名称=温度;正确的? ...当我在这里评论时如何缩进代码? :)
  • scanf 几乎没问题(去掉 &)。其余的都是错误的。
  • 为什么其余的都错了?它也在 gcc 上给出了同样的错误
【解决方案2】:

“数组名是指向第一个元素的指针(这里是char指针..对吗?)。对吧?”

char name[31];
char *temp;
/* ... */
name = temp;

name = temp 赋值中,name 的值被转换为指向char 的指针。值被转换,不是对象。该对象仍然是一个数组,并且数组不是可修改的左值。由于赋值操作数的约束要求赋值运算符的左操作数是可修改的左值,因此出现错误。

【讨论】:

  • 投反对票的人,请解释你为什么投反对票。
  • @JensGustedt 谢谢 Jens ;)
【解决方案3】:

首先,数组是内存缓冲区,而不是指针,尽管它们可能会在需要时衰减为指针。

现在,name 是一个数组,所以你不能分配给它。将数组赋值给指针时,数组衰减为指针,赋值有效。

【讨论】:

  • 这对我来说是新信息...谢谢
【解决方案4】:

不,指针指向相同类型的对象。这意味着如果分配得当,指针可以用作完全成熟的数组。
NON 指针意味着您“面前”有数据,这不会让您正确获取数据(也有生命周期问题),所以说实话,指针最好在任何地方使用你的情况。

【讨论】:

    【解决方案5】:

    因为 'name' 是一个数组。所以 这一行:

    name = temp;
    

    会给你错误。

    你在 for 循环中的条件也是错误的。 name[] 会有垃圾值,你不能使用

    name[i]!='\0'
    

    作为条件。

    【讨论】:

      猜你喜欢
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      • 2020-07-10
      • 2018-03-05
      • 2011-03-07
      • 1970-01-01
      • 2018-03-30
      相关资源
      最近更新 更多