#include <iostream>
int main()
{
const int& a = 10;
const int *b = &a;
std::cout << "*b = " << *b << '\n';
}
其输出到控制台:
*b = 10
引用和指针都指向一个 const 对象。
考虑另一个类似的代码。
#include <iostream>
#include <iomanip>
int main()
{
int i = 10;
const int &a = i;
int *b;
b = &i;
// b = &a;
std::cout << "&a == &i is " << ( &a == &i )
<< ", &a == b is " << ( &a == b )
<< '\n';
}
我怀疑你对别的东西感兴趣——比如
那些。您想通过指针访问常量值/变量并对其进行修改。如果这是可能的,那么,当然,这将是对安全系统的违反,恒常性——总之,有理由问——为什么会这样?
但事实是,链接是它所指内容的绝对同义词。而且它不能引用其他东西——它所指的是什么是在创建链接时确定的,并且将其他东西分配给链接结果是一个值的分配——链接本身作为指向某物的指针不会改变。
你可以写
但你不能
如果这不是您感兴趣的 - 那么我很抱歉,但是您的问题“为什么这可能”指的是完全不可理解的。
在这段代码中
不
在这段代码中,您试图在未定义的地址处写入内存(因为指针,如果它具有自动内存,则未初始化,或者如果它具有静态内存,则使用空常量初始化)值 10 ,由引用引用
a。也就是说,代码片段具有未定义的行为。您很可能是指以下代码片段。
此代码片段尝试使用 引用的 const 对象的地址初始化非 const 指针(即指向非 const 对象的指针)
a。该代码也被认为是格式错误的,即不符合标准。否则,您可以通过该非常量指针更改 const 对象。
写是正确的
也就是说,引用都是常量,指针指向常量对象。
下面是一个演示程序。
其输出到控制台:
引用和指针都指向一个 const 对象。
考虑另一个类似的代码。
在这个程序中,你可以写
因为指针和指针将引用的对象都是非常量的。
但是你不能写(这句话在程序中被注释掉了)
因为在这种情况下,右侧有一个常量引用,即认为该引用引用了一个常量对象,而非常量指针位于左侧。
但是,引用和指针所引用的对象的地址是相同的,因为它们引用的是同一个对象。