传递指针作为函数参数的疑问:接收副本还是原指针?
嘿,这个问题算是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
相关产品推荐
相关产品推荐

