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。
输出格式
- 操作
1、4:一行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
- 通过率
- ?
- 上传者