关于指针和引用的c++考试问题

C++ Exam Questions on pointers and references

本文关键字:引用 c++ 考试 问题 于指针 指针      更新时间:2023-10-16

我在复习考试,这是关于过去的一篇论文。我不确定最后一部分的答案(这个模块的所有讲师都忙了一周了…)

问题涉及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;
...

但是我不能算出MyIncrementFourthMyIncrementFifth的答案

展开注释…

回答是:

int *b = &a;
MyIncrementFourth(&b);
MyIncrementFifth(b);

你说得对,就这个问题的背景来说,这似乎太简单了,所以让我们试着深入研究一下细节。

MyIncrementFourth中,该函数接收int **参数。该参数的值被解释为:

  1. 存在的内存地址(指针)->
  2. 存在的内存地址(指针)->
  3. int值。

假设我们的a变量没有被优化成寄存器,并且实际上在0xC0000000处有一个保留的内存地址。我们需要将这个值放到另一个变量中,并将这个新变量的地址作为函数的输入值传递。所以我们需要分配一些新的内存来保存值0xC0000000。假设新地址是0xC0000004。现在我们实际上可以调用MyIncrementFourth((int **)0xC0000004);,它会工作,但不可避免的是我们有两个可用的地址。最简单的方法是通过int *b =&a;