有什么区别

char* name

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

const char* name

当前回答

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

char * const和const char *之间的区别是什么?

其他回答

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

char * const和const char *之间的区别是什么?

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

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

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

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

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

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

char *name

您可以更改名称所指向的字符,也可以更改名称所指向的字符。

const char* name

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

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

编辑:

从评论来看,你的问题似乎是在问当指针指向一个字符串字面值时,两个声明之间的区别。

在这种情况下,您不应该修改名称所指向的字符,因为这可能导致未定义的行为。 字符串字面值可以分配在只读内存区域(实现定义),用户程序不应该以任何方式修改它。任何这样做的尝试都会导致未定义的行为。

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

在线示例示例:

#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丢弃指针目标类型的限定符

注意,编译器对第二种情况发出警告,但对第一种情况没有发出警告。