有什么区别

char* name

指向一个常量字符串字面量,和

const char* name

当前回答

char mystring[101] = "My sample string";
const char * constcharp = mystring; // (1)
char const * charconstp = mystring; // (2) the same as (1)
char * const charpconst = mystring; // (3)

constcharp++; // ok
charconstp++; // ok
charpconst++; // compile error

constcharp[3] = '\0'; // compile error
charconstp[3] = '\0'; // compile error
charpconst[3] = '\0'; // ok

// String literals
char * lcharp = "My string literal";
const char * lconstcharp = "My string literal";

lcharp[0] = 'X';      // Segmentation fault (crash) during run-time
lconstcharp[0] = 'X'; // compile error

// *not* a string literal
const char astr[101] = "My mutable string";
astr[0] = 'X';          // compile error
((char*)astr)[0] = 'X'; // ok

其他回答

我想在这里补充一点,最新的编译器,例如VS 2022,不允许用字符串文字初始化char*。char* ptr = "Hello";当const char* ptr = "Hello"时抛出错误;是合法的。

Char *是一个可变指针,指向一个可变字符/字符串。

Const char*是一个指向不可变字符/字符串的可变指针。不能更改此指针所指向的位置的内容。此外,当你尝试这样做时,编译器需要给出错误消息。出于同样的原因,不支持将const char*转换为char*。

Char * const是一个不可变指针(它不能指向任何其他位置),但它所指向的位置的内容是可变的。

Const char* Const是一个指向不可变字符/字符串的不可变指针。

问题是两者之间有什么区别

char *name

指向一个常量字符串字面量,和

const char *cname

即给定

char *name = "foo";

and

const char *cname = "foo";

两者之间没有太大的区别,两者都可以被视为正确的。由于C代码的长期遗留,字符串字面量的类型是char[],而不是const char[],并且有许多旧代码同样接受char *而不是const char *,即使它们不修改实参。

两者的主要区别一般是*cname或cname[n]将计算为const char类型的左值,而*name或name[n]将计算为char类型的左值,这是可修改的左值。如果赋值的目标不是可修改的左值,则要求符合标准的编译器生成诊断消息;它不需要对char类型的左值赋值产生任何警告:

name[0] = 'x'; // no diagnostics *needed*
cname[0] = 'x'; // a conforming compiler *must* produce a diagnostic message

在这两种情况下,编译器都不需要停止编译;它为cname[0]的赋值生成一个警告就足够了。生成的程序不是正确的程序。构造的行为是未定义的。它可能会崩溃,或者更糟,它可能不会崩溃,并且可能会改变内存中的字符串文字。

如果你想,第一个你可以改变,第二个你不能。阅读有关const正确性的内容(有一些关于区别的很好的指南)。还有char const * name,你不能重新指向它。

案例1:

char *str = "Hello";
str[0] = 'M'  //Warning may be issued by compiler, and will cause segmentation fault upon running the programme

上面设置str指向“Hello”字面值,该字面值是硬编码在程序的二进制图像中,在内存中被标记为只读,这意味着这个String字面值的任何更改都是非法的,并且会抛出分割错误。

案例2:

const char *str = "Hello";
str[0] = 'M'  //Compile time error

案例3:

char str[] = "Hello";
str[0] = 'M'; // legal and change the str = "Mello".