char *和const char *之间的区别?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了char *和const char *之间的区别?相关的知识,希望对你有一定的参考价值。

有什么区别

char* name

它指向一个常量字符串文字,和

const char* name
答案

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

const char*是一个指向不可变字符/字符串的可变指针。您无法更改此指针指向的位置的内容。此外,编译器在尝试执行此操作时需要提供错误消息。出于同样的原因,不推荐将const char *转换为char*

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

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

另一答案
char *name

您可以更改name指向的char,以及它指向的char。

const char* name

您可以更改name指向的char,但不能修改它指向的char。 更正:您可以更改指针,但不能更改name指向的字符(https://msdn.microsoft.com/en-us/library/vstudio/whkd4k6a(v=vs.100).aspx,请参阅“示例”)。在这种情况下,const说明符适用于char,而不是星号。

根据MSDN页面和http://en.cppreference.com/w/cpp/language/declarationsconst之前的*是decl-specifier序列的一部分,而const之后的*是声明者的一部分。 声明说明符序列后面可以跟多个声明符,这就是const char * c1, c2c1声明为const char *c2声明为const char的原因。

编辑:

从注释中,您的问题似乎是在指针指向字符串文字时询问两个声明之间的区别。

在这种情况下,您不应该修改name指向的char,因为它可能导致Undefined Behavior。字符串文字可以在只读存储器区域中分配(实现定义),并且用户程序不应该以任何方式修改它。任何这样做的尝试都会导致未定义的行为。

因此,在这种情况下(使用字符串文字)的唯一区别是第二个声明给你一点点优势。如果您尝试在第二种情况下修改字符串文字,编译器通常会给您一个警告。

Online Sample Example:

#include <string.h>
int main()
{
    char *str1 = "string Literal";
    const char *str2 = "string Literal";
    char source[] = "Sample string";

    strcpy(str1,source);    //No warning or error, just Undefined Behavior
    strcpy(str2,source);    //Compiler issues a warning

    return 0;
}

输出:

cc1:警告被视为错误 prog.c:在函数'main'中: prog.c:9:错误:传递'strcpy'的参数1会丢弃指针目标类型的限定符

请注意,编译器会警告第二种情况,但不会警告第一种情况。

另一答案
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] = ''; // compile error
charconstp[3] = ''; // compile error
charpconst[3] = ''; // 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
另一答案

在任何情况下都不能修改字符串文字,无论指向该字符串文字的指针是否声明为char *const char *

但是,不同之处在于,如果指针是const char *,那么编译器必须提供诊断,如果您尝试修改指向的值,但如果指针是char *,那么它不会。

另一答案

第一个你可以实际改变,如果你想,第二个你不能。阅读有关const正确性的信息(有关于差异的一些不错的指南)。还有char const * name,你不能重新指责它。

另一答案

情况1:

char *str = "Hello";
str[0] = 'M'  //No warning or error, just Undefined Behavior

上面的设置指向文本值“Hello”,它在程序的二进制映像中是硬编码的,在内存中标记为只读,意味着此字符串文字中的任何更改都是非法的,这会引发分段错误。

案例2:

const char *str = "Hello";
str[0] = 'M'  //Compiler issues a warning

案例3:

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

实际上,char* name不是指向常量的指针,而是指向变量的指针。你可能在谈论另一个问题。

What is the difference between char * const and const char *?

另一答案

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

char *name

它指向一个常量字符串文字,和

const char *cname

即特定

char *name = "foo";

const char *cname = "foo";

两者之间没有太大差异,两者都可以看作是正确的。由于C代码的长期遗留,字符串文字有一种char[],而不是const char[],并且有很多旧代码同样接受char *而不是const char *,即使它们不修改参数。

2的一般主要差异是*cnamecname[n]将评估为const char类型的左值,而*namename[n]将评估为char类型的左值,即modifiable lvalues。如果target of the assignment is not a modifiable lvalue,则需要符合标准的编译器来生成诊断消息;它不需要在分配给char类型的左值时产生任何警告:

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

在任何一种情况下,编译器都不需要停止编译;它足以产生对cname[0]任务的警告。生成的程序不是正确的程序。构造的行为是未定义的。它可能会崩溃,甚至更糟,它可能不会崩溃,并可能会更改内存中的字符串文字。

另一答案

只是举一个例子:

    std::cout << typeid(2.3).name() << '
'; // -----> prints "double" simply because
    //2.3 is a double
    //But the "double" returned by typeid(2.3).name() is indeed a 
    //const char * which consists of 'd','o','u','b','l','e'and''.
    //Here's a simple proof to this:
    std::cout << typeid(typeid(2.3).name()).name() << '
'; //prints: "const char *"
    const char* charptr
    charptr = typeid(2.3).name();
    std::cout << charptr[3]; // --------->  prints: "b"

(我正在使用typeinfo库:http://www.cplusplus.com/reference/typeinfo/type_info/name

    //Now let's do something more interesting:
    char* charptr2="hubble";
    strcpy(charptr, charptr2);  // --------> Oops! Sorry, this is not valid!

你可以运行它,为自己更好地看待事物。

以上是关于char *和const char *之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

(const_cast<char*> 和没有之间有啥区别?

“const char *”和“const string”之间的确切技术区别是啥

const char * char const * char * const 三者的区别

const char*和char* const的区别

char * 和 const char * 之间的转换 [关闭]

const char * char const * char * const 三者的区别