所以这只是一个副本:
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;。我不明白不应该抛出错误吗?
请你给我一个正确的例子,因为我做错了。
答案 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
的变量a
。 const 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 *
如果仍有任何疑问,请随时评论:)