char *和char []

时间:2011-08-03 17:49:24

标签: c++

为什么这是对的?

#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;
}

5 个答案:

答案 0 :(得分:15)

在第一个示例中,s=t执行指针赋值。在第二个中,s=t尝试将指针值(由数组表达式t的隐式转换或“衰减”产生)分配给数组对象。 C ++不允许进行数组赋值。

C和C ++恰好在这方面非常相似; comp.lang.c FAQ的第6节很好地介绍了数组和指针之间的关系。

答案 1 :(得分:7)

第一个示例指定指向另一个有效的指针。

第二个例子将一个数组分配给另一个不允许在C&amp; C中使用的数组。 C ++两者。


This 优秀的C ++常见问题解答条目和 this 答案应该是您的好读。

答案 2 :(得分:2)

除了其他人说的话:

与流行的看法相反,数组实际上并不是指针。他们在使用它们时只是分享了许多相似之处,并且对指针进行了几次隐式转换,这就是为什么它们很容易使用它们就好像它们是指针一样。

数组是(C和C ++)的独立功能。它的行为与指针不完全相同。

例如,可以在堆栈上分配数组对象,这在使用new(返回指针)和指针分配对象时是不可能的。

您展示的示例是另一个示例:您不能将数组用作指针。但是你可以使用指针指向一段连续的内存(数组)。

答案 3 :(得分:1)

数组名称是一个const指针。意思是,当你声明一个数组时,这个名字是一个指针,不能改变它。

答案 4 :(得分:1)

char *s表示:
地址和价值都不是一成不变的。

const char *s:

值是常数,而不是地址。

const char * const s;

地址和价值都是不变的。

char *s[] 

是一个数组。数组基址始终存在。您无法更改它的基址,这在c。

中是不允许的