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

时间:2015-05-27 10:20:43

标签: c++ pointers reference

我正在修改考试,这是在过去的论文上。我不确定最后一部分的答案(并且该模块的所有讲师都已经错过了一周......)

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

您对(i)中的代码进行了哪些修改,以便编译和执行以产生相同的输出(使用相同的函数)?

我们假设这个我们的目的是使对函数的调用适应如下:

int a = 42;
cout << "Result" << endl;
MyIncrementFirst(&a);
cout << "first " << a << endl;
...

但我无法解决MyIncrementFourthMyIncrementFifth

的答案

1 个答案:

答案 0 :(得分:0)

根据评论......

正确的 答案是:

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

你理所当然地说这对于问题的背景来说似乎太简单了,所以让我们试着深入研究细节。

MyIncrementFourth中,函数会收到int **参数。该参数应该包含一个值,该值被解释为:

  1. 存储器地址(指针),其中存在 - &gt;
  2. 存储器地址(指针),其中存在 - &gt;
  3. int值。
  4. 假设我们的a变量没有优化到寄存器中,实际上在0xC0000000处有一个保留的内存地址。我们需要将此值放在另一个变量中,并将该新变量的地址作为函数的输入值传递。所以我们需要分配一些新的内存来保存值0xC0000000。假设新地址位于0xC0000004。现在我们可以实际调用MyIncrementFourth((int **)0xC0000004);它可以工作,但我们有2个地址是不可避免的。最简单的方法是int *b =&a;