关于指针和引用的c++考试问题
C++ Exam Questions on pointers and references
我在复习考试,这是关于过去的一篇论文。我不确定最后一部分的答案(这个模块的所有讲师都忙了一周了…)
问题涉及C和c++的一些共同部分,给出如下条件:
void MyIncrementFirst(int * i) {
(*i)++;
}
void MyIncrementSecond(int i) {
i++;
}
void MyIncrementThird(int & i) {
i++;
}
void MyIncrementFourth(int ** i) {
*i = new int(0);
}
void MyIncrementFifth(int *& i) {
i = new int(69);
}
并使用如下命令运行:
int * a = new int(42);
cout << "Result" << endl;
MyIncrementFirst(a);
cout << "first " << *a << endl;
MyIncrementSecond(*a);
cout << "second " << *a << endl;
MyIncrementThird(*a);
cout << "third " << *a << endl;
MyIncrementFourth(&a);
cout << "fourth " << *a << endl;
MyIncrementFifth(a);
cout << "fifth " << *a << endl;
他们问它是做什么的,它给出了什么输出。我明白这一点,但问题是这样的:
(iii)假设a(i)部分给出的代码中的第1行被以下代码取代:
int a = 42;
您将对a(i)中的代码进行哪些修改,以便它将编译和执行以产生相同的输出(使用相同的函数)?
我们假定意味着将对函数的调用调整为如下方式:
int a = 42;
cout << "Result" << endl;
MyIncrementFirst(&a);
cout << "first " << a << endl;
...
但是我不能算出MyIncrementFourth
和MyIncrementFifth
的答案
展开注释…
对 回答是:
int *b = &a;
MyIncrementFourth(&b);
MyIncrementFifth(b);
你说得对,就这个问题的背景来说,这似乎太简单了,所以让我们试着深入研究一下细节。
在MyIncrementFourth
中,该函数接收int **
参数。该参数的值被解释为:
- 存在的内存地址(指针)->
- 存在的内存地址(指针)->
-
int
值。
假设我们的a
变量没有被优化成寄存器,并且实际上在0xC0000000处有一个保留的内存地址。我们需要将这个值放到另一个变量中,并将这个新变量的地址作为函数的输入值传递。所以我们需要分配一些新的内存来保存值0xC0000000。假设新地址是0xC0000004。现在我们实际上可以调用MyIncrementFourth((int **)0xC0000004);
,它会工作,但不可避免的是我们有两个可用的地址。最简单的方法是通过int *b =&a;
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 具有默认值的引用获取函数
- 如何使用基类指针引用派生类成员
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 如何引用基类的派生类?