2011-10-20 45 views
10

这是我的另一个question的延续。字符串数组初始化

考虑下面的代码:

char *hi = "hello"; 

char *array1[3] = 
{ 
    hi, 
    "world", 
    "there." 
}; 

它不能编译令我惊讶(显然我不知道C语法以及我认为),并生成以下错误:

error: initializer element is not constant 

如果我改变的char *转换成char []它编译罚款:

char hi[] = "hello"; 

char *array1[3] = 
{ 
    hi, 
    "world", 
    "there." 
}; 

谁能给我解释一下为什么?

回答

6

在第一个示例中(char *hi = "hello";),您正在创建一个非const指针,该指针被初始化为指向静态常量字符串“hello”。理论上这个指针可以指向任何你喜欢的东西。

在第二个示例(char hi[] = "hello";)中,您明确定义了一个数组,而不是指针,所以它引用的地址是不可修改的。请注意,数组可以被认为是指向特定内存块的不可修改的指针。

你的第一个例子实际上在C++(我的编译器,至少)编译没有问题。

+1

谢谢。有没有办法使用const关键字来使第一段代码工作? – lang2

+1

@ lang2不在该范围内。看这[C常见问题](http://c-faq.com/ansi/constasconst.html)。甚至不用'char * const hi'(常量指向字符的指针)。 – cnicutar

+0

只是添加了一些东西,我不确定它是否会工作......你的第一个版本在C++中编译好 - 我会在C编译器的时候尝试一下:) – icabod