You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传递指针作为函数参数的疑问:接收副本还是原指针?

嘿,这个问题算是C++指针传递里的高频疑惑了,我给你拆解明白:

核心结论:函数接收的是指针的副本

当你把一个指针传给函数时,函数拿到的是原指针的副本——就好比你给朋友复制了一把你家门的钥匙,朋友手里的钥匙和你的是两个独立的物件,但它们都能打开同一扇门(也就是指向同一块内存)。

你的例子里的改动是临时的

看你写的这段代码:

void printNext(myClass* foo) { 
    foo = foo->next; 
    cout << foo; 
}

这里的foo是函数的局部参数,也就是原指针的副本。你在函数里修改foo的指向(让它指向next),只会改变这个副本的指向,完全不会影响到外面的原指针。等函数执行完毕,这个副本就被销毁了,原指针该指向哪还是哪,改动只在函数作用域内临时生效。

如果想让改动永久生效怎么办?

要是你希望函数能修改原指针的指向,有两种常用方法:

  • 传递指针的指针(双重指针):
    void printNext(myClass** foo) { 
        *foo = (*foo)->next; 
        cout << *foo; 
    }
    // 调用时传原指针的地址:printNext(&myOriginalPtr);
    
    这里函数操作的是原指针的内存地址,修改*foo就是直接改动原指针的指向。
  • 传递指针的引用:
    void printNext(myClass*& foo) { 
        foo = foo->next; 
        cout << foo; 
    }
    // 调用时直接传原指针:printNext(myOriginalPtr);
    
    引用相当于原指针的“别名”,操作引用就等于直接操作原指针本身,改动会同步到函数外部。

如何避免改动原指针?

其实你现在的写法已经做到了呀!因为传递的是指针副本,函数里修改副本根本碰不到原指针。如果还想进一步防止函数不小心修改指针指向的对象内容,可以把参数声明为const指针:

void printNext(const myClass* foo) { 
    // foo = foo->next; 这行代码会直接报错,因为const指针不允许修改指向
    // 如果只是想打印next的地址,直接写:
    cout << foo->next; 
}

这样既能保证函数能访问对象内容,又能防止意外修改指针指向或对象成员。

内容的提问来源于stack exchange,提问作者Jackson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:50:57