我正在自学c++,我被指针困住了。特别是在调用指针并更改它们的不同函数中。我知道对于这里的大多数人来说这非常简单,但如果有人可以帮助我,我需要一些解释。我在 macOS 上使用 Xcode 来运行 c++。
我的代码是:
#include <iostream>
int a = 2, b = 17, c = 1;
void p(int a, int &c) {
int b = a * c++;
std::cout <<a <<" "<< b <<" "<< c << std::endl;
if (4 * a > c) {
p(b / 2, a);
std::cout <<a <<" "<< b <<" "<< c << std::endl;
}
}
int main() {
p(c, a);
std::cout <<a <<" "<< b <<" "<< c << std::endl;
return 0;
}
带输出:
1 2 3
1 1 2
0 0 2
2 1 2
2 2 3
3 17 1
一开始它调用
p(a=1,c=2)
,其中 c
是一个指针。而且 c++
中的操作顺序是,首先取消引用 c
,然后将 c
加 1。因此a = 1, b=3 , c = 3
。为什么它给出a = 1, b = 2, c = 3
?
在 C 语言的早期,唯一的调用约定是“按值传递”。这意味着函数仅接收其参数的副本,如果更改参数,则仅更改本地副本,并且当函数返回时外部变量仍具有其初始值。因此,为了允许函数更改某些变量,我们将pointers传递给这些变量,这些变量必须在函数内取消引用。示例代码:
void p(int a, int *c) {
int b = a * (*c)++; // outer c variable is increased
std::cout <<a <<" "<< b <<" "<< *c << std::endl; // this is not C language ;-)
...
}
...
p(a, &c); // explicitely pass a pointer to c
在这里,我们显式地
传递外部变量的地址(使用&c
),并且仍然显式地取消引用函数内部的指针(
*c
)。虽然明确可以很好,但这意味着代码会被大量的 &
和
*
弄乱,这对初学者不太友好......然后 C++ 带来了引用。当您通过引用传递变量时,函数不再拥有外部变量的副本,而是直接使用它。以前的代码可以变成:
void p(int a, int &c) {
int b = a * c++; // outer c variable is increased thanks to the reference
std::cout <<a <<" "<< b <<" "<< c << std::endl;
...
}
...
p(a, c); // implicitely pass a reference to c