Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指向非常量数据的常量指针_C++_Pointers_Constants_Type Mismatch - Fatal编程技术网

C++ 指向非常量数据的常量指针

C++ 指向非常量数据的常量指针,c++,pointers,constants,type-mismatch,C++,Pointers,Constants,Type Mismatch,考虑以下情况1: const int n = 5; int* p = &n; 这是无效的,因为&n类型为contint*,p类型为int*(类型不匹配错误) 现在,考虑这种情况2: int k = 4; int *const p = &k; 此案例编译成功,没有任何错误。显然,p属于int*const类型,&k属于int*类型。在这种情况下,存在类型不匹配,但它是有效的 问题:为什么第二种情况有效,即使存在类型不匹配 在这种情况下,存在类型不匹配 没有;在这种情况下没有类

考虑以下情况1:

const int n = 5;
int* p = &n; 
这是无效的,因为
&n
类型为
contint*
p
类型为
int*
(类型不匹配错误)

现在,考虑这种情况2:

int k = 4;
int *const p = &k; 
此案例编译成功,没有任何错误。显然,
p
属于
int*const
类型,
&k
属于
int*
类型。在这种情况下,存在类型不匹配,但它是有效的

问题:为什么第二种情况有效,即使存在类型不匹配

在这种情况下,存在类型不匹配

没有;在这种情况下没有类型不匹配。它是指向非成本的指针,您可以使用指向非常量的指针初始化它

或者,如果您坚持存在“不匹配”,则类似于以下“不匹配”:

为什么第二个案例有效


简单地说:初始化器的常量与是否初始化常量对象无关。此外,初始化器是非类类型的prvalue,因此常量限定甚至不适用于它。

首先,
int*const
表示指向非常量int的常量指针。因此指针和指针对象类型之间绝对没有类型不匹配

其次,您可以始终将非常量变量的地址放入指向常量的指针中。因此,这也是有效的:

int n = 5;
const int * p = &n;

您可以将非常量分配给常量,但不能将非常量分配给常量。使用“常量”-通知访问始终是合法的,但反之亦然。如果您具有读/写访问权限,则可以不使用写部分而保持只读。但如果你只有读权限,你就不能要求写权限。这是两个不同的常量。一个是低级常量,另一个是顶级常量。1。指向
const
的指针(或引用)只是承诺不通过该指针/引用修改对象。这并不意味着对象是不可修改的。2.
int*const
是一个常量指针(该指针不能重新指定为指向其他对象),而不是指向
const
的指针;int*常数p=&n合法吗?不,康斯特在哪里很重要。指向int的常量指针。当然,你可以用gValue初始化常量。我在另一个答案中提到了这一点,但是如果你发现一个重复的问题,请随意投票关闭。对不起,让我澄清一下。鉴于你对C++标签中的内容的了解,我确信你可以在写一个答案的同时找到一个副本,用C++的锤子你可以自己关闭这个问题。这难道不是比有很多相同的问题更可取吗?@cigien,是什么阻止了你这么做?@NicolasDusart没有什么阻止我。我甚至可以将此作为eeorika回答的目标的副本来结束,因为他们之前已经多次回答了这个问题。的确,找到目标比简单回答一个简单的问题更难,但我希望我能说服一个高代表性用户,让他们相信努力找到目标的好处,而不是反复回答这样的基本问题。尽管如此,如果某些用户的优先级不同,没有规则阻止他们以这种方式行事。
int n = 5;
const int * p = &n;