char * and char[]

char * and char[]

本文关键字:char and      更新时间:2023-10-16

为什么是这样?

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

在第一个示例中,s=t执行指针赋值。在第二种情况下,s=t试图将指针值(由数组表达式t的隐式转换或"衰减"产生)赋值给数组对象。c++不允许数组赋值

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

第一个例子将一个指针赋值给另一个有效的指针。

第二个例子将一个数组赋值给另一个数组,这在C &c++。


这个优秀的c++ FAQ条目和这个答案对你来说应该是一个很好的阅读。

除了其他人所说的:

与普遍的看法相反,数组实际上不是指针。它们只是在使用时有很多相似之处,并且有一些隐式转换到指针,这就是为什么很容易像使用指针一样使用它们。

数组是(C和)c++的独立特性。它的行为并不完全像指针。

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

你展示的例子是另一个:你不能像使用指针一样使用数组。但是你可以使用指针指向一个连续的内存块(数组)。

数组名称为const指针。也就是说,当你声明一个数组时,它的名字是一个指针,不能被改变。

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

const char *s:

value是常量,不是地址。

const char * const s;

地址和值都是常量

char *s[] 

是一个数组。数组基址始终是常量。你不能改变它的基址,这在c中是不允许的。