char * const和const char *之间有什么区别? (重复 - 需要更多说明)

时间:2017-10-15 13:56:10

标签: c++ pointers

所以这只是一个副本:

  

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无法改变? 我已经在我的代码中更改了它,并打印了#34;已更改&#34;。我不明白不应该抛出错误吗?

请你给我一个正确的例子,因为我做错了。

2 个答案:

答案 0 :(得分:4)

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

指针和指针指向的“东西”。它们是两个独立的,离散的“东西”。指针本身。无论指针指向什么。这是第一个关键概念。

第二个关键概念是其中一个或另一个可以是const。或两者都可以是const。无论const是什么,都无法改变。

如果指针本身为const,则无法更改指针。它总是指向相同的“事物”,直到指针超出范围并被破坏。但是,即使指针是const,你也可以使用这个指针修改它的“东西”,除非“东西”本身是const

如果指针是指向const“thing”的指针,则无法使用此指针更改“thing”。但是你可以将指针改为指向不同的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”仍然是“那里”,无论“那里”是什么,const指针仍然指向它。无论你对一个指针做什么,都不会影响另一个指针。它们是不同的“东西”。

你需要经历轻微的心理转变。你需要在指法中明确地将指针本身与指针所指向的内容分开。

答案 1 :(得分:0)

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

例如,如果twitterStream.sample()char *ptr=a将存储变量ptr的地址。 任何定义为常量的变量都不能改变它的值。 如果a,则const int a=5之类的任何语句都无效,因为这会改变禁止的值。

同样,如果指针a++指向带有声明ptr的变量aconst int *ptr=a之类的语句无效,因为ptr=b无法指向ptr,因为它是一个指向b的常量指针。

理解了这一点后,恰好有两种常量和指针组合。

TYPE 1:指向常量的指针

a

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

分析以下陈述: -

ptr=0x9978

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

TYPE 2:常量指针

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

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

此处无法修改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 *

如果仍有任何疑问,请随时评论:)