4

可能重复:
char * const 和 const char * 有什么区别?
const char * const 与 const char *?

当我们在 c 中定义一个函数时,我们可以使用 (const char *str) 、 (char const *str) 或 (char *const str) 作为变量。它们之间有什么区别?

4

4 回答 4

8

前两个是等价的,const char *strchar const *str声明str为指向 char 常量的指针(这意味着不应修改 char 本身),第三个char *const str声明 str 为常量指针(意味着一旦分配它就应该' t 被改变)到 a char(它本身可以自由修改)。

一篇关于如何阅读类型声明的有趣文章在这里,如果你想检查它。

于 2012-10-09T14:30:07.637 回答
5

char const * str并且const char * str是相同的,因为 const 适用于其左侧的术语,或者,如果左侧没有类型,则适用于右侧的术语。这就是为什么你在const char 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!
于 2012-10-09T14:29:18.540 回答
2

将 C 声明读作:

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

const char *str “str 是一个指向 char 的指针,它是常量”

char const *str “str 是一个指向常量字符的指针”(同上)

char *const str “str 是一个指向 char 的常量指针”

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

const char *str = &cch;
char const *str = &cch;
char * const str = &ch;
于 2012-10-09T14:38:48.740 回答
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;
于 2012-10-09T14:28:28.683 回答