C++ 将C样式字符串初始化为NULL与空字符串之间的区别

C++ 将C样式字符串初始化为NULL与空字符串之间的区别,c++,c,string,C++,C,String,这三者是否相等: char* p= NULL; char* q = ""; char r[] = {'\0'}; 我怀疑第一个和其他的不同,但我不能完全确定 char* p = NULL; 这将为指针p分配NULL,这意味着p不指向任何有效的内存地址 char* q = ""; char r[] = {'\0'}; 它们都创建空字符串,并且基本上是等价的q指向有效的内存地址 R>代码>是一个空字符串数组。 < p>我回答C++,尽管OP也把问题标记为C。这是两种不同的语言。把它们混为一谈不

这三者是否相等:

char* p= NULL;
char* q = "";
char r[] = {'\0'};
我怀疑第一个和其他的不同,但我不能完全确定

char* p = NULL;
这将为指针
p
分配NULL,这意味着
p
不指向任何有效的内存地址

char* q = "";
char r[] = {'\0'};
它们都创建空字符串,并且基本上是等价的<与上一示例中的
p
不同,code>q指向有效的内存地址<代码> R>代码>是一个空字符串数组。

< p>我回答C++,尽管OP也把问题标记为C。这是两种不同的语言。把它们混为一谈不是个好主意

char* p= NULL; // initializes the character pointer to NULL
char* q = ""; // character pointer points to a valid string with null content
char r[] = {'\0'}; // character array having null content
本声明:

char* q = "";
在C++03中使用了不推荐使用的转换,在C++11中变得无效。我们现在是C++14


这两项声明:

char* p= NULL;
char r[] = {'\0'};
两者根本不同。第一个声明一个指针并将其设置为null。第二个声明一个项的数组,该项设置为null


关于

这三个相等吗


答案是否定的,一点也不:一个无效,一个声明指针,一个声明数组。

第二种形式在C中可能吗?难道
q
不应该包含字符而不是字符串吗?它怎么能引用由
”返回的某个内存位置?@code学徒:啊哈,这看起来很有意义:-)很高兴你这么做了。在第二个中,
q
实际上指向某个包含“\0”字符的只读内存(对于某些编译器),尽管第三个可以随时修改(在任何编译器中)。第一个是简单地指向内存的某个保留区域,由编译器检查,如果该区域已被修改,则会引发类似于
空指针异常
,不知道它们在C中称之为什么,我猜
空指针引用
:-)我只是C语言的新手,对我来说太简单了,如果我犯了一些错误:-)1用两种不同的语言标记。第二行也暗示了从代码< > const char */COD>到 char */COD>的隐式转换,其中C++至少被禁止。jogojapanAlso值得一提的是
char*q=“”分配只读内存。A
q[0]=某些东西将失败。@jogojapan:C中的
const
并不意味着真正的只读内存,其中as定义如
char*p=“”是的,这就是我添加这个的原因。此外,这不是关于“吹毛求疵”,而是在使用定义良好的术语/表达式时要准确。最后,我肯定无意亲自批评你!:-)@好的,当然可以。是的,我承认“隐式强制转换”并不是最恰当的术语用法,就像“暗示..隐式”并不像代码学徒所指出的那样是描述事物的最聪明的方式。只是有一刻我觉得我们讨论的是我在评论中措辞的细节,而不是要点,即上面的第2行和第3行并不等同。(不确定“基本相当”。)