char *和char[]的区别

4
为什么这是正确的?
#include<iostream>
using namespace std;
int main()
{
    char *s="raman";
    char *t="rawan";
    s=t;
    cout<<s;

return 0;
}

但这是错误的吗?

#include<iostream>
using namespace std;
int main()
{
    char s[]="raman";
    char t[]="rawan";
    s=t;
    cout<<s;

return 0;
}

14
定义"对"和"错"。 - Michael Todd
3
初始化后,不能为数组分配新的值,但可以为指针分配。 - Joe
4
第一点是不正确的——字符串字面量应为const char*,而不是char*。将其赋值给char*很危险。 - Cat Plus Plus
1
为避免潜在的麻烦,请使用 std::string。它存在有很好的理由。 - hammar
2
@Cat Plus Plus: 不,字符串字面值是const char[N],其中N是字面值的长度加1(以允许终止符'\0')。但在大多数情况下,它们会衰减为const char*,其值是指向字符串第一个字符的指针。例如,sizeof "hello, world"得到的是13,而不是指针的大小。 - Keith Thompson
显示剩余8条评论
5个回答

15
在第一个例子中,s=t 进行了指针赋值。在第二个例子中,s=t尝试将指向数组表达式t的指针值(由隐式转换或“衰减”产生)分配给数组对象。C ++不允许数组赋值。
在这方面,C和C ++非常相似; comp.lang.c FAQ 第6节很好地涵盖了数组和指针之间的关系。

只是提醒一下:我本意是要拒绝你上次的标记(那个说答案是故意误导的),但我不小心把它标记为有用。标记不应该用于指示技术不准确或完全错误的答案。 - NullUserException
@NullUserException:明白了,感谢您的通知。我认为情况已经得到解决。如果您愿意,可以删除您的评论。 - Keith Thompson

7
第一个例子是将指针分配给另一个指针,这是有效的。
第二个例子是将数组分配给另一个数组,在C和C++中都是不允许的。
这篇 杰出的C++ FAQ条目和 这个 回答应该是您的好读物。

2
除了其他人说的以外:
与常见的误解不同,数组实际上不是指针。只是在处理它们时有许多相似之处,并且具有一些隐式转换为指针的特性,因此很容易像使用指针一样使用它们。
数组是(C和)C++的一个独立特性。它的行为方式并不完全像指针那样。
例如,可以在堆栈上分配数组对象,而使用new(返回指针)和指针分配对象时则不可能。
你展示的例子是另一个例子:你不能像使用指针一样使用数组。但是你可以使用指针来指向连续的内存块(数组)。

1

数组名是一个常量指针。这意味着,当你声明一个数组时,数组名是一个指针,它不能被改变。


1

char *s 的意思是:
地址和值都不是常量。

const char *s:

数值是常量,而非地址。

const char * const s;

地址和值都是常量。

char *s[] 

是一个数组。数组的基地址始终是固定的。您无法更改其基地址,在C语言中是不允许的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接