c++ - 为什么在 main() 中声明的指针没有改变?

标签 c++ pointers

<分区>

我知道通过指针调用,我们在其中传递变量地址。像这样:

void swap(int *x, int *y)
{
   int temp;
   temp = *x; /* save the value at address x */
   *x = *y; /* put y into x */
   *y = temp; /* put x into y */

   return;
}

  swap(&a, &b);

还有通过引用调用,在这两种方法中,函数中所做的更改都反射(reflect)在实际参数的变量中。
但是为什么在这种调用的情况下传递的实际参数没有改变:

#include <iostream>
using namespace std;
void foo(int* c){
c=c+1;
}
int main()
{
    int a=5;
    int *c=&a;
    cout<<&c<<endl; //0x7ffe1a74f3b0
    foo(c);        
    cout<<*c<<endl;//5
    cout<<&c<<endl;//0x7ffe1a74f3b0
}

这里传递给 foo() 的 c 是 a 的地址。所以这是按值调用。
根据我的说法,这里 c 应该打印了垃圾值。请解释这里发生了什么。

最佳答案

And also call by reference, in both of these methods the changes made in the function are reflected in actual arguments' variable.

但是有一个重要的区别:更改总是针对引用/指向的任何内容,而不是引用/指针本身(通常不可能修改引用)。

这就是为什么在 foo 内为 c 分配新值对 foo 外的 c 没有影响的原因:传递给函数的指针被复制

如果需要修改指针,则需要通过传递指针引用或指向指针的指针来添加另一层解引用。

关于c++ - 为什么在 main() 中声明的指针没有改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44579762/

相关文章:

c++ - BFS 与 Dijkstra 的运行时间,值没有意义

pointers - 在将 `slice` 附加到之后指向 `slice` 元素的指针的行为

c++ - 将 void 指针传递给具有 const char * const 的函数

c++ - 为什么这个程序没有抛出任何错误?

java - 如何修复错误并向源文件添加功能并保证不会破坏某些应用程序?

c++ - 检查迭代器是否对 QT 容器有效

c++ - 错误 : has initializer but incomplete type

带有额外 0x0 的 C++ 字符串?

c++ - 字符数组和指针的基本混淆

c++ - 如何将某个类的指针方法转换为指针函数?