之间有什么区别
char ch [ ] = "hello";
和
char ch [ ] = { 'h','e','l','l','o','\0'};
以及为什么我们只能这样做
char *p = "hello";
但是不能这样做
char *p = {'h','e','l','l','o','\0'};
答案 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
指针,不是数组,不能使用数组初始化列表进行初始化。我突出显示了上面的array
和pointer
,强调数组和指针是不同的类型。在某些情况下,数组被隐式转换为指向其第一个元素的指针,就像将数组传递给函数或分配给相同类型的指针一样。这并不意味着它们是相同的。它们具有不同的指针算术和不同的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