char[]和char*的区别是什么?

4

据我所知,在您的示例中没有。 - Constantinius
3
@Constantinius,这里有一个区别:第一个声明了一个新数组,其中包含“earth”字符串的字符,而第二个是指向“earth”字面值的指针。修改前者是合法的,而修改后者则是未定义的行为。 - Etienne de Martel
1
是的,请尝试使用 name++,你会看到不同之处。还有 sizeof(name) - paxdiablo
5个回答

7
char namea[] = "earth";
char *pname = "earth";

其中一个是数组(名称namea指的是一块字符)。

另一个是指向单个字符的指针(名称pname指的是指针,它恰好指向一块字符块的第一个字符)。

虽然前者经常会转化为后者,但并非总是如此。尝试对它们进行sizeof操作,看看我是什么意思。

数组的大小就是数组的大小(包括终止的空字符在内,共六个字符)。

指针的大小取决于指针宽度(4或8等)。pname 指向的大小不是数组,而是第一个字符。因此大小为1。

您还可以使用pname++之类的方法来移动指针(除非它们被声明为常量,例如char *const pname = ...;)。您不能将数组名称移动到其第二个字符(namea++;)。


3
在 C++03 中,char *name = "earth" 已经过时。应该改为 const char *name = "earth"。此外,需要强调的是,任何方式修改字符串字面值都会导致未定义行为。 - Alok Save

2
(1) char name[] = "earth";

name 是一个字符数组,其内容为'e','a','r','t','h',0。这些字符的存储位置取决于 name[] 的声明位置(通常是堆栈或数据段)。

(2) char *name = "earth";

name是一个指向常量字符串的指针。存储"earth"的位置在只读内存区域中。

在C++中,这已经过时了,应该使用const char *name = "earth";


1
  1. char name[] = "earth"; 在堆栈上创建一个可变数组,大小为6,值为earth\0
  2. char* name = "earth"; 定义一个指向字符串常量的指针,其值为earth\0

0

使用

char *name = "earth"

你不能修改名称的内容。

因此

name[2] = 'A';

char* 以 '\0' 字符结尾,而 name[] 具有固定大小。

会导致段错误。

初始化变量会对数组产生巨大的性能和空间惩罚。只有在打算更改字符串时才使用数组方法,它占用堆栈空间并且每次进入变量作用域都会增加一些严重的开销。否则请使用指针方法。


0

char[] 描述了一个具有固定元素数量的 char 数组。

char* 描述了一个指向 char 的指针,通常在内存中跟随一系列 char,通常以空字符 \0 结尾。


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