C 关于字符数组初始化的混淆
两者的区别是什么C 关于字符数组初始化的混淆,c,string,pointers,C,String,Pointers,两者的区别是什么 char ch [ ] = "hello"; 及 为什么我们只能这样做 char *p = "hello"; 但是不行 char *p = {'h','e','l','l','o','\0'}; 没有区别ch对象在两个声明中完全相同 关于我们为什么不能这样做: char *p = {'h','e','l','l','o','\0'}; 具有多个值的初始值设定项列表只能用于聚合类型(结构或数组)的对象。只能使用指针值初始化char* 实际上: char
char ch [ ] = "hello";
及
为什么我们只能这样做
char *p = "hello";
但是不行
char *p = {'h','e','l','l','o','\0'};
没有区别ch
对象在两个声明中完全相同
关于我们为什么不能这样做:
char *p = {'h','e','l','l','o','\0'};
具有多个值的初始值设定项列表只能用于聚合类型(结构或数组)的对象。只能使用指针值初始化char*
实际上:
char ch [ ] = "hello";
及
它们不一样。第一个是用字符串文字的元素初始化数组,第二个是指向字符串文字的指针。这两种方法没有区别
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
这两个数组声明是相同的。至于指针声明,形式为
char*p={'h','e','l','l','o','\0'}
无效,因为它未包含在编译器设计中
据我所知,当
char*p=“hello”代码>是。当他们在const
位“hello”应该是一个const char*const
,但它们是惰性的,并且只使用char*
。但是为了保持信仰,他们让这一点溜走了
然后他们说。好啊他们可以平等
然后他们有char[]={'a','b',…}代码>世界上一切都很好
邪恶的怪物来了,向他们猛扑过来。但是这个邪恶的怪物心情很好,说它应该是const char*p=“hello”
,但我会很高兴的
他回家了,但是这个邪恶的怪物没有被逗乐。他在他的领域里口述char*p={'h','e','l','l','o','\0'}代码>是异教徒的标志
基本上是出了差错。只要从现在开始做,就有需要满足的旧代码 让我们一个接一个地看吧。下面是使用字符串literal“hello”
初始化字符数组ch
下面是使用数组初始化列表初始化数组ch
。这相当于上述说法
char ch[] = {'h', 'e', 'l', 'l', 'o', '\0'};
下面是初始化一个字符指针p
,指向存储字符串文字“hello”
的内存。这是只读存储器。试图修改其内容不会产生编译错误,因为C
中的字符串文字与C++
中的字符串文字不同,不是常量限定的,而是会导致未定义的行为,甚至程序崩溃
char *p = "hello";
const char *p = "hello"; // better
下面的最后一句话显然是错误的
char *p = {'h','e','l','l','o','\0'};
p
是此处的char
指针,不是数组,无法使用数组初始化列表进行初始化。我突出显示了上面的单词array
和pointer
,以强调数组和指针是不同的类型。在某些情况下,数组会隐式转换为指向其第一个元素的指针,就像将数组传递给函数或指定给相同类型的指针一样。这并不意味着它们是相同的。它们有不同的指针算法和不同的sizeof
值
.Strings是一种特殊情况,您可以在其中初始化指向字符串文本的指针代码>,但那是不同的。(CharStyle:c99)那么*p[]将成为指针数组我不想使用这个,但我想问为什么char*p不能这样做?char*p[]={'h','e','l','l','o','0'}这是错误的,任何编译器都有权拒绝它。您声明了一个char*
数组,但您的元素是char
;这个语法是绝对正确的,我们可以定义char*p[]没有错,但你可以给它更多的语法爱。只是saying@ThunderGr-如果觉得有趣,就得a+1。好吧,对于一个不熟悉你讲的故事的人来说,a+1实际上应该是有帮助的。我担心这并不能向试图学习C的人澄清任何事情。所以,我也不同意。为什么const char*const
?指针本身不必是常数,只需它指向的对象。@ajay-它不必是常数,但可以是常数。如果指针是常量,编译器可以优化bitEvery字符串文字是否也是数组初始值设定项,但显然不是每个数组初始值设定项都是字符串文字。字符串文本的值是指向它的指针。“hello”也是一个数组,我们使用char*p没有问题。缺乏解释,在我看来,“hello”
是一个字符串文字,而不是严格意义上的数组char
数组不需要以null结尾,但根据定义,字符串是以null结尾的。edit是一个字符串文本,它是一个字符数组。所以,严格来说,它看起来像一个数组。你们两个都在混淆术语<代码>“hello”
是字符串文字,不是数组,不是字符串,不是字符*
或其他任何东西,它是字符串文字。如何使用它取决于上下文。在数组初始化的上下文中,它的行为类似于初始值设定项列表;在指针初始化的上下文中,它的行为类似于指向静态数据的指针。它之所以能够这样做,是因为它既不是一个静态数据,也不是一个字节数组。我认为我们没有那么困惑。我想我们都知道数据在内存中的方式,以及数组在内存中的实际含义。两种情况下的内存结构相同
char ch[] = "hello";
char ch[] = {'h', 'e', 'l', 'l', 'o', '\0'};
char *p = "hello";
const char *p = "hello"; // better
char *p = {'h','e','l','l','o','\0'};