C语言中char* 和char[]的区别[duplicate]

ngynwnxp  于 2023-03-07  发布在  其他
关注(0)|答案(5)|浏览(127)
    • 此问题在此处已有答案**:

10年前关闭了。

    • 可能重复:**

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 *'

数组name是指向第一个元素的指针(这里是字符指针..对吗?)。对吗?上面的代码意味着字符数组和char*是不同的类型..是真的吗?为什么类型是name != char *?为什么我可以将另一个char指针赋给char指针(name数组)?

uqxowvwt

uqxowvwt1#

数组名是指向第一个元素的指针(这里是字符指针,对吗?
错了。在大多数情况下,数组 * 衰减 * 为指向第一个元素的指针,但它们肯定不是指针。在C FAQ中有一个很好的解释和一个非常有价值的图片(a是数组,p是指针):

从类型“char *”分配给类型“char[31]”时,类型不兼容
在C中数组是不可修改的左值,你不能改变它们指向什么,因为它们一开始就不指向任何地方

4c8rllxm

4c8rllxm2#

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

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

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

z9zf31ra

z9zf31ra3#

首先,数组是内存缓冲区,而不是指针,尽管在需要时它们可能会衰减为指针。
现在,name是一个数组,所以你不能给它赋值。当你给一个数组赋值给一个指针的时候,这个数组衰减为一个指针,赋值是有效的。

vmdwslir

vmdwslir4#

不,指针指向一个相同类型的对象。这意味着一个指针如果分配正确,可以作为一个完全成熟的数组使用。
NON指针意味着数据在这里“摆在你面前”,这样你就不能正确地获取数据(还有生存期问题),所以老实说,指针最好在你的情况下随处使用。

yhived7q

yhived7q5#

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

name = temp;

会给予你错误。
此外,for循环中的条件是错误的。name[]将包含垃圾值,您无法使用

name[i]!='\0'

作为条件。

相关问题