关于字符数组初始化的困惑

时间:2014-02-22 10:05:07

标签: c string pointers

之间有什么区别
   char ch [ ] = "hello";

   char ch [ ] = { 'h','e','l','l','o','\0'};

以及为什么我们只能这样做

   char *p = "hello";

但是不能这样做

   char *p = {'h','e','l','l','o','\0'};

5 个答案:

答案 0 :(得分:3)

char ch [ ] = "hello";
char ch [ ] = { 'h','e','l','l','o','\0'};

没有区别。两个声明中的ch对象完全相同。

关于我们为什么不能这样做:

char *p = {'h','e','l','l','o','\0'};

多个值的初始化列表只能用于聚合类型(结构或数组)的对象。您只能使用指针值初始化char *

实际上:

char ch [ ] = "hello";

char *p = "hello";

不一样。第一个使用字符串文字的元素初始化数组,第二个是指向字符串文字的指针。

答案 1 :(得分:2)

两个数组声明是相同的。至于指针声明,表单char *p = {'h','e','l','l','o','\0'};无效,只是因为它没有包含在编译器设计中。

据我所知,在char *p = "hello";出现时,为什么该声明不应有效,理论上没有理由。

答案 2 :(得分:1)

他们在const

错误时打开了一段时间

“你好”这个位应该是const char * const,但它们在懒惰的地方并且只使用char *。但为了保持信仰的活力,他们会放弃这一点。

然后他们说。好。他们可以是平等的。

然后他们有char [] = { 'a', 'b', ...};并且世界上一切都很好

邪恶的怪物来到他们身上char *p = "hello"。但这个邪恶的怪物心情很好,并说它应该是const char *p = "hello",但我会对此感到高兴。

他回家了,但邪恶的怪物并没有被逗乐。他在他的领域中指责char *p = {'h','e','l','l','o','\0'};是异教徒的标志。

基本上有一个吵架。从现在开始就行,并且需要满足旧代码。

答案 3 :(得分:1)

让我们一个接一个。以下是使用字符串文字char初始化ch 数组 "hello"

char ch[] = "hello";

以下是使用数组初始化列表初始化数组 ch。这相当于上述陈述。

char ch[] = {'h', 'e', 'l', 'l', 'o', '\0'};  

以下是初始化char 指针 p以指向存储字符串文字"hello"的内存。这是只读内存。尝试修改其内容不会产生编译错误,因为C中的字符串文字不是C++中的const限定,但会导致未定义的行为甚至程序崩溃。

char *p = "hello";
const char *p = "hello";  // better

以下最后一句话是完全错误的。

char *p = {'h','e','l','l','o','\0'};

p这里是char指针,不是数组,不能使用数组初始化列表进行初始化。我突出显示了上面的arraypointer,强调数组和指针是不同的类型。在某些情况下,数组被隐式转换为指向其第一个元素的指针,就像将数组传递给函数或分配给相同类型的指针一样。这并不意味着它们是相同的。它们具有不同的指针算术和不同的sizeof值。

答案 4 :(得分:-2)

没有区别
char ch [ ] = "hello";
char ch [ ] = { 'h','e','l','l','o','\0'};

但请查看以下

char *p = "hello";  //This is correct

char *p = {'h','e','l','l','o','\0'};  //This is wrong

如果您想使其正确,您需要使用

char *p[]={'h','e','l','l','o','\0'}; //This works