(const char *str)、(char const *str)和(char *const str)有什么区别?

5

https://dev59.com/Hm445IYBdhLWcg3wRoPH - ArjunShankar
指向常量的指针与常量指针之间的区别...还要查看const指针的用途是什么? - LihO
2
类似于 const int * const * const x; 这样的写法可能有些过度,即使它准确地描述了 const x 的属性。- 来自 Google C++ 代码风格指南 :) - Alex F
遵循 螺旋规则 - Mike
这个不是和标记为重复的链接重复,因为它是在3个之间进行比较,而不仅仅是2个。 - Eric
4个回答

10
第一和第二种写法等价,const char *strchar const *str 都声明 str 是一个指向字符常量的指针(这意味着字符本身不应该被修改),第三种写法 char *const str 声明 str 是一个指向 char常量指针(意味着一旦赋值就不应该改变),而 char 本身可以自由修改。
如果你想查看如何阅读类型声明的有趣文章,可以在这里阅读。

6

char const * strconst char * str 是相同的,因为 const 关键字应用于其左侧的术语或者如果左侧没有类型,则应用于右侧的术语。这就是为什么在 const char const * 上会出现双重 const 错误。两者都是指向常量字符的指针。您可以更改指针的值,但不能更改解除引用后的值:

const char * my_const_str;
my_const_str = "Hello world!"; // ok
my_const_str[0] = "h"; // error: my_const_str[0] is const!

char * const 另一方面是一个常量指针。您不能更改指针,但可以更改指针所引用的值。

char * const my_const_ptr = malloc(10*sizeof(char));
my_const_str[0] = "h"; // ok
my_const_str = "hello world"; // error, you would change the value of my_const_str!

那么,如何将const变量加倍,以便两者都无法更改? - Mawg says reinstate Monica
1
@MawgsaysreinstateMonica 这是一个新问题,应该单独发布;),尽管这里已经有答案:https://dev59.com/0HM_5IYBdhLWcg3w-4dg。 (顺便说一句,是 const char * const str)。 - Zeta

3

将C语言声明理解为:

从变量开始。向右看,向左看,再向右看(就像在英国过马路一样)。当你看到*时,说“指向”,当你看到[]时,说“数组”,当你看到()时,说“函数”,等等。在你的例子中,右边没有任何内容;

const char *str “str是指向常量字符的指针”

char const *str “str是指向常量字符的指针”(与上面相同)

char *const str “str是指向字符的常量指针”

char ch = 'x';
const char cch = 'y';

const char *str = &cch;
char const *str = &cch;
char * const str = &ch;

1
const char * str1: declare str as pointer to const char
char const * str2: declare str as pointer to const char
char * const str3: declare str as const pointer to char

因此,在前两种情况下,指针是可变的,但指针引用的数据不可变。

在最后一种情况下,指针不可变,但内部数据可变。

因此,让我们看一些操作:

str1[0];      // legal;
str1[0] += 3; // illegal;
str1 = NULL;  // legal;

str3[0];      // legal;
str3[0] += 3; // legal;
str3 = NULL;  // illegal;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接