Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 关于字符数组初始化的混淆_C_String_Pointers - Fatal编程技术网

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*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'};