我正在修改考试,这是在过去的论文上。我不确定最后一部分的答案(并且该模块的所有讲师都已经错过了一周......)
问题涉及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;
...
但我无法解决MyIncrementFourth
和MyIncrementFifth
答案 0 :(得分:0)
根据评论......
正确的 答案是:
int *b = &a;
MyIncrementFourth(&b);
MyIncrementFifth(b);
你理所当然地说这对于问题的背景来说似乎太简单了,所以让我们试着深入研究细节。
在MyIncrementFourth
中,函数会收到int **
参数。该参数应该包含一个值,该值被解释为:
int
值。假设我们的a
变量没有优化到寄存器中,实际上在0xC0000000处有一个保留的内存地址。我们需要将此值放在另一个变量中,并将该新变量的地址作为函数的输入值传递。所以我们需要分配一些新的内存来保存值0xC0000000。假设新地址位于0xC0000004。现在我们可以实际调用MyIncrementFourth((int **)0xC0000004);
它可以工作,但我们有2个地址是不可避免的。最简单的方法是int *b =&a;