(const char * str),(char const * str)和(char * const str)之间的区别是什么?

时间:2012-10-09 14:26:05

标签: c pointers const

  

可能重复:
  What is the difference between char * const and const char *?
  const char * const versus const char *?

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

4 个答案:

答案 0 :(得分:5)

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

有关如何阅读类型声明is here的有趣文章,以防您想要查看。

答案 1 :(得分:3)

char const * strconst char * str是相同的,因为const适用于左侧的术语,或者如果左侧没有类型,则适用于右侧的术语。这就是你在const char const *上得到双重const错误的原因。两者都是常量char的指针。您可以更改指针的值,但不能更改取消引用的值:

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!

答案 2 :(得分:2)

将C声明读作:

从变量开始。向右看,向左看,然后再向右看(就像在英国过马路一样)。当您看到*时,您说“指向”,当您看到[]时,您说“数组”,何时查看()您说“功能”等等。在您的示例中没有什么是正确的;

const char *str“str是指向常量”

的char的指针

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

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

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

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

答案 3 :(得分: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;