C 中 char* 和 char[] 的区别 [重复]

问题描述 投票:0回答:5

可能重复:
C - “char var[]”和“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 *'

Array

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

c arrays pointers
5个回答
10
投票

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

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

Arrays and pointers

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

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


6
投票

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

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

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


1
投票

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

现在,

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


1
投票

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


1
投票

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

name = temp;

会给你错误。

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

name[i]!='\0'

作为条件。

© www.soinside.com 2019 - 2024. All rights reserved.