我再次来到这里是因为 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;
产生以下结果:
first 43
second 43
third 44
fourth 0
fifth 69
其中一些语法我以前没有见过(例如*&
)所以我在这里可能完全错了。
First:
这看起来很简单。我传入一个指向整数的指针,然后取消引用该指针并递增其值,因此我不是递增指针,而是递增它指向的实际值。不使用内存分配,并且该函数使用引用传递来修改值。
Second:
这与上面类似,因为指针被取消引用以从指针而不是内存地址获取整数值。现在该函数使用值传递,因此在函数执行中使用变量的副本。这意味着在这里增加 a 不会对您传入的变量产生任何影响,a 的值将保持为 42,但传入变量的副本在函数执行期间将其值更改为 43。
Third:
我的理解是'&'
运算符基本上是说“...的内存地址”,因此该函数将获取传入指针的内存地址,找到它指向的值,并将 this 加一。这就是打印 43 的原因。这是使用引用传递。
Fourth:
如果我没记错的话'**
' 语法表示指向指针的指针。这意味着当将 &a 传递给函数时,您正在传递指针的内存地址,因此当您取消引用该指针并将其值设置为 anew int(0);
实际上,您正在覆盖该地址处的现有数据(本例中为 42),因此会打印值 0。这使用了引用传递。
fifth:
我以前没见过这个语法(*&)
。我查了一下这个语法,我认为它基本上是在说“通过引用而不是值传递给我”,所以它似乎与前面提到的取消引用指针相同。同样,因为当值设置为 a 时,这是按引用传递而不是值new int(69);
该位置的当前数据被覆盖,因此输出 69。
编辑:忘记包含我的问题!我想知道我的想法是否正确,这都是考试准备,所以我想确保我做得正确。我只是想确保我的逻辑是正确的,如果我做错了什么或错过了什么,有人会能够引导我走向正确的方向