2017-10-15 52 views
2

所以这仅仅是一个重复:char * const和const char *之间有什么区别? (复制 - 需要更多的澄清)

What is the difference between char * const and const char *?

有什么区别:

char * const 

const char * 

但我仍然这样做不明白。

所以给出的第一个答案:

不同的是,为const char *是指向一个const char, 而char * const的是一个常量指针为char。

第一个,被指向的值不能改变,但指针 可以。第二,指向的值可以改变,但指针不能(类似于引用)。

好了,所以,我已经编写这:

//exercises 
char* barfoo = "variable_test"; 

const char* my_pointer_to_const_char = barfoo; //"barfoo" can't be changed but the pointer to it, can! 

barfoo = "changed!"; 
std::cout<< barfoo << std::endl; 

所以,根据上述的答案,barfoo不能改变? 我已将其更改为我的代码,并打印出“已更改”。我不明白它不应该抛出一个错误?

你能否给我一个正确的例子,因为我做的事情很清楚。

+0

为什么不能'barfoo'改变?它是一个非const指针,指向非常量字符。你创建了一个指向其原始值的const指针并不相关。 –

+0

,因为:“第一个值指向的值不能更改,但指针可以是” barfoo是指向的值。不是? –

+0

这是一个不同的参考。 –

回答

4

您在理解中缺少两个关键概念。

指针和指针指向的“事物”。它们是两个分离的“事物”。指针本身。无论指针指向什么。这是第一个关键概念。

第二个关键概念是其中一个或另一个可以是const。或者两者都可以是const。无论是const,都不能更改。

如果指针本身是const,则不能更改指针。它总是指向相同的“东西”,直到指针超出范围并被销毁。但是,即使指针是const,也可以使用该指针修改它的“事物”,除非“事物”本身是const

如果指针是指向const“东西”的指针,则不能使用此指针更改“东西”。但是你可以改变指针指向一个不同的const“东西”。

或者说,即使指针是,据称,是一个指向const“东西”,如果是一个的指向同一个“东西”另一个指针,其他指针不一定指向一个const “事情”;它可能是一个非const指针。在这种情况下,另一个指针可以用来改变相同的“东西”(因为毕竟它不是指向某个const的东西)。而现在,即使第一个指针是指向const的指针,它指向的const事物现在已经改变。这导致约别名是其他一些天天好左规则的神秘讨论...

但是,回到主题手头:

char* barfoo = "variable_test"; 

const char* my_pointer_to_const_char = barfoo; //"barfoo" can't be changed but the pointer to it, can! 

barfoo = "changed!"; 

在这里,你改变了指针之一,本身。你的没有改变任何指针指向。字符串“variable_test”仍然是“there”,无论那个“there”在哪里,并且const指针仍然指向它。无论你对一个指针做什么,对另一个指针都没有影响。他们是不同的“事物”。

你需要经历轻微的精神转变。你需要在你的头脑中清楚地指出指针本身,无论指针指向什么。

+0

“这导致了关于别名更好的别名规则的讨论......”ahah很好!恩方式感谢真的很好的答案!它帮助! –

+0

就像你说的那样,“字符串”variable_test“仍然是”那里“,我怎么能找到它并且改变它?我可能听起来很愚蠢,但我想要一个IDE或编译器告诉我的例子,我不能改变它,因为它是不变的。 –

+0

根据定义,文字字符串是'const'。编译器可能会让你将它分配给一个'char *',并给你一个严重的警告。您可能能够编译修改它的代码。并且该代码可能会运行而不会崩溃。但它仍然是未定义的行为。 –

0

我们知道指针存储其操作数的地址值。

举例来说,如果char *ptr=aptr将存储变量a的地址。 定义为常量的变量不能更改其值。 如果const int a=5,那么像a++之类的任何语句都是无效的,因为这会改变禁止的值。

类似地,如果指针ptr指向变量a且声明为const int *ptr=a。像ptr=b这样的语句将无效,因为ptr不能指向b,因为它是指向a的常量指针。

了解了之后,碰巧有两个常量和指针的组合。

TYPE 1:指向恒定

const int a=5; 
int* const ptr=a; 

在这种情况下,该变量是一个恒定,其值不能被修改。 假设a的内存地址是0x9978。因为,指针存储变量的地址,ptr=0x9978

分析以下语句: -

a=6; //Invalid: Value of a cannot be changed 
*ptr=9; //Invalid: *ptr refers to a and will change its value. 
int b=t; 
ptr=b;//Valid: ptr is not constant and can point anywhere 

希望这个概念现在很清楚。

TYPE 2:常数指针

在这里,指针是恒定的。一旦它指向一个变量,它就不能指向任何其他变量。它在其整个生命周期中存储一个不变的地址。

int a=7; 
const int* ptr=a; 

这里的值不能修改为ptr(0x9978)的值。 再次看到语句: -

a=6; //Valid: Value of a can be changed 
*ptr=9; //Valid: *ptr refers to a and its value can be altered. 
int b=t; 
ptr=b;//InValid: ptr is constant and cannot point anywhere else. 

因此,ptr不能指向任何其他变量现在。
回到你的问题,要更好地理解,请考虑char *不作为指针,而是作为字符串类型(字符缓冲区)的变量!

char* barfoo = "variable_test"; //barfoo is a string storing 'variable_test' 
const char* my_pointer_to_const_char = barfoo; 
// This is type 2, constant pointer. Thus, my_pointer_to_const_char cannot 
//point to any other variable and will always store the address of barfoo 
barfoo = "changed!"; 
//this is perfectly valid as this statement will alter the value of string 
//barfoo. my_pointer_to_const_char will still store the address of barfoo. 

如果还有任何疑问,请随时发表评论:)