HM093 引用本质是指针常量

HM093 引用本质是指针常量

HM093 引用本质是指针常量

来源: 第 93 集 C++中的引用-引用的本质

难度: 入门

时间限制: 1s

空间限制: 64MB

题目描述

引用用起来像别名,内部实现却是**指针常量**。编译器看到 int &ref = a; 时,会把它转换成类似:

int * const ref = &a;

也就是:指针的**指向不能改**,指针**指向的值可以改**。这正是「引用一旦初始化就不能改绑」的原因——const 锁死了指向。

之后你写 ref = 20;,编译器会自动加上解引用,变成 *ref = 20;,于是 \(a\) 变成 \(20\)。输出 ref 时也会先解引用再取值,所以看到的仍是 \(20\),而不是地址。这些 * 都由编译器代劳,使用时把 ref 当成 \(a\) 即可;但要能回答「引用的本质是指针常量」。

有两个整数 \(a\)、\(b\),引用绑定 \(a\)。按操作处理:改值合法,改指向非法。必须同时真正定义 int &aliasName = valueA;int * const pointerConst = &valueA;,用两种写法做同一件事。

输入格式

第一行两个整数 \(a\)、\(b\)(\(-10^9 \le a,b \le 10^9\))。

第二行一个整数 \(q\)(\(1 \le q \le 100\))。

接下来 \(q\) 行:

  • 1\ x:执行 ref = x(编译器当成 *ref = x),并输出 ok
  • 2:尝试让引用改绑到 \(b\)(相当于 pointerConst = &b),必须拒绝。
  • 3:输出当前 \(a\)、\(b\) 以及通过引用看到的值。
  • 4\ x:用指针常量 *pointerConst = x 改值,并输出 ok

输出格式

  • 操作 14:一行 ok
  • 操作 2:一行 denied
  • 操作 3:一行三个整数,相邻之间一个空格。

行末换行。

样例

输入 #1

10 30
4
1 20
2
3
4 100

输出 #1

ok
denied
20 30 20
ok

输入 #2

10 20
2
3
1 30

输出 #2

10 20 10
ok

说明

样例 1:ref = 20 把 \(a\) 改成 \(20\);试图改绑被拒绝,所以 \(b\) 仍是 \(30\)、引用仍看到 \(a\);再用指针常量写成 \(100\)。引用和 int * const 对指向的限制相同:值能改,指向不能改。使用时直接把引用当原变量,不必自己写 *

信息

ID
1092
难度
(无)
分类
(无)
标签
(无)
递交数
0
已通过
0
通过率
?
上传者