2011-10-25 61 views
3

可能重复:
C - Difference between “char var[]” and “char *var”?
Difference between char a[]=“string”; char *p=“string”;char []和char *之间的区别?

会有人解释究竟是什么的char []与char *之间的区别? 例如差

感谢之间
char name[] = "earth"; 

char *name = "earth"; 

+0

AFAIK在你的例子中没有。 – Constantinius

+3

@Constantinius有一个:第一个声明一个包含“earth”字符的新数组,而第二个是一个指向“earth”字面的指针。修改前者是合法的,修改后者是未定义的行为。 –

+1

是的,尝试'名称++',你会看到不同之处。另外'sizeof(name)'。 – paxdiablo

回答

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

一个是一个数组(该名称namea块的字符)。

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

虽然前者往往会衰减到后者,但情况并非总是如此。试着对他们做一个sizeof来看看我的意思。

该数组的大小,以及该数组的大小(六个字符,包括终端空)。

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

您还可以移动指针的东西像pname++(除非他们宣布不变,喜欢的东西,当然char *const pname = ...;)。您不能移动阵列名称来指向它的第二个字符(namea++;)。

+0

'char * name =“earth”'在C++ 03中已弃用。它必须**为const char * name =“earth”'。另外,它很容易补充说,修改一个字符串*无论如何*导致UB。 –

0

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

char*描述由字符的通常以空字符\0

1
  1. 炭名称[] =“地”封端的序列的指针为char,一般遵循的存储器;在堆栈中创建一个可变数组,大小为6,值为earth \ 0
  2. char * name =“earth”;定义了一个指针,指向一个字符串值地球恒定\ 0
1
(1) char name[] = "earth"; 

name是具有内容作为,'e''a''r''t''h'0一个字符阵列。此字符的存储位置取决于宣布name[]的位置(通常是堆栈或数据段)。

(2) char *name = "earth"; 

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

在C++中,不赞成这种方式,它应该是const char *name = "earth";

0

随着

char *name = "earth" 

不得修改名称的内容。

因此

name[2] = 'A'; 

字符*由 '\ 0' 字符终止而名称[]具有固定的大小。

将导致段错误。

初始化变量需要巨大的性能和空间损失 为阵列。如果您打算更改 字符串,请仅使用数组方法,但每次输入变量的作用域时,它都会占用堆栈中的空间,并会增加一些严重的开销 。否则使用指针方法 。

相关问题