为什么这是对的?
#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;
}
答案 0 :(得分:15)
在第一个示例中,s=t
执行指针赋值。在第二个中,s=t
尝试将指针值(由数组表达式t
的隐式转换或“衰减”产生)分配给数组对象。 C ++不允许进行数组赋值。
C和C ++恰好在这方面非常相似; comp.lang.c FAQ的第6节很好地介绍了数组和指针之间的关系。
答案 1 :(得分:7)
第一个示例指定指向另一个有效的指针。
第二个例子将一个数组分配给另一个不允许在C&amp; C中使用的数组。 C ++两者。
答案 2 :(得分:2)
除了其他人说的话:
与流行的看法相反,数组实际上并不是指针。他们在使用它们时只是分享了许多相似之处,并且对指针进行了几次隐式转换,这就是为什么它们很容易使用它们就好像它们是指针一样。
数组是(C和C ++)的独立功能。它的行为与指针不完全相同。
例如,可以在堆栈上分配数组对象,这在使用new(返回指针)和指针分配对象时是不可能的。
您展示的示例是另一个示例:您不能将数组用作指针。但是你可以使用指针指向一段连续的内存(数组)。
答案 3 :(得分:1)
数组名称是一个const指针。意思是,当你声明一个数组时,这个名字是一个指针,不能改变它。
答案 4 :(得分:1)
char *s
表示:
地址和价值都不是一成不变的。
const char *s:
值是常数,而不是地址。
const char * const s;
地址和价值都是不变的。
char *s[]
是一个数组。数组基址始终存在。您无法更改它的基址,这在c。
中是不允许的