关于C#:(const char * str),(char const * str)和(char * const str)之间有什么区别?

What's the difference among (const char *str) , (char const *str) and (char *const str)?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
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)作为变量,它们之间有什么区别?


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

这里有一篇关于如何读取类型声明的有趣文章,以防您想检查它。


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

1
2
3
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是一个常量指针。不能更改指针,但可以更改指针取消引用的值。

1
2
3
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!


读取C声明为:

从变量开始。向右看,向左看,然后再向右看(比如在英国过马路)。当你看到*你说"指向",当你看到[]你说"数组",当你看到()你说"函数"等,在你的例子中,右边没有东西;

"str是指向常量char的指针"

char const *strstr是指向常量char的指针(同上)

char *const str"str是指向char的常量指针"

1
2
3
4
5
6
char ch = 'x';
const char cch = 'y';

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

1
2
3
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

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

在最后一种情况下,指针不是可变的,但里面的数据是可变的。

那么,让我们来看一些操作:

1
2
3
4
5
6
7
str1[0];      // legal;
str1[0] += 3; // illegal;
str1 = NULL;  // legal;

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