指针的传递仍然是传递副本

写数据结构遇到的问题。

假设有

void DeleteTree(BTREE BT)

{

其中BTREE本身就是一种指针数据类型。

如果在函数中做如下操作

1.

delete BT ;  

BT = NULL ;

那么在主函数中如果要遍历的话,将会出现错误,因为遍历操作判断BT是否为空,子函数中将其置空,注意,其置空的只是主函数传给子函数的BT的副本,故BT不为空,但子函数中将BT 的空间delete掉了,因此程序出错。需要注意啊

2.

BT = BT->lChild ; 

Delete BT ; 

BT = NULL ; 

这个是不会出错的,的确是将BT的左孩子指针置空了。


这 两种情况混在一起还真是让人迷惑额

<think>嗯,用户想知道C++中指针传递是否是按值传递,也就是传递副本,还是传递指针本身。首先,我需要回顾一下C++中参数传递的机制。在C++中,函数参数的传递方式主要有两种:按值传递和按引用传递。当按值传递时,函数会得到参数的副本,而原始数据不会被修改;按引用传递则相反,函数操作的是原始数据的引用,可以直接修改原始数据。 那指针作为参数时的情况呢?指针本身是一个变量,存储的是另一个变量的内存地址。当我们将指针作为参数传递给函数时,实际上传递的是这个指针变量的值,也就是它所保存的内存地址的副本。这意味着在函数内部,对这个指针副本进行修改(比如改变它指向的地址)不会影响原来的指针。但是,如果通过这个指针副本去修改它所指向的内存内容,比如解引用后赋值,那么原始数据会被改变,因为两个指针(原指针副本)都指向同一块内存地址。 举个例子,假设有一个函数`void func(int* ptr)`,当调用这个函数并传入一个指针时,函数内部的`ptr`是原始指针的一个副本。如果在函数里执行`ptr = new int;`,这只会改变副本的指向,原指针不变。但如果执行`*ptr = 5;`,则会修改原指针指向的内存值。 用户可能混淆了指针传递和引用传递的区别。如果使用引用传递指针,比如`void func(int*& ptr)`,那么传递的就是指针的引用,此时在函数内修改`ptr`的指向会影响原指针。但默认情况下,指针是按值传递的,即传递副本。 需要确认是否所有情况下指针传递都是按值传递的,有没有例外情况。比如,当指针作为函数参数时,是否总是创建副本。根据C++标准,是的,除非显式使用引用。因此,答案应该是肯定的:指针传递是按值传递传递的是指针副本,但通过副本可以修改指向的数据。 可能用户遇到的问题是,在函数内修改了指针的指向,但外部指针没变,或者修改了指针指向的数据,导致外部数据变化。需要明确区分这两种情况,说明副本和原指针的关系,以及如何通过副本影响数据。 总结:指针传递是按值传递,即传递指针副本,但通过副本可以修改原始数据,因为指向同一内存地址。若需修改指针本身(如重新指向其他内存),则需要传递指针的引用或指针指针。</think>在C++中,指针传递本质上是按值传递(即传递副本)。以下是详细分析: ### 1. 指针传递的机制 当指针作为函数参数时,传递的是指针变量的值(即内存地址的副本)。例如: ```cpp void modifyPointer(int* p) { p = new int(10); // 修改的是副本指针的指向 } int main() { int x = 5; int* ptr = &x; modifyPointer(ptr); // 此时ptr仍指向x,而非新分配的地址 } ``` 这里`ptr`的副本被修改为指向新内存,但原始`ptr`不受影响[^1]。 ### 2. 对指向数据的修改 虽然指针副本,但通过解引用操作可以修改原始数据: ```cpp void modifyData(int* p) { *p = 20; // 通过副本指针修改原始数据 } int main() { int x = 5; modifyData(&x); // x的值变为20 } ``` 此时两个指针(原指针副本)共享同一内存地址。 ### 3. 对比引用传递 若需要修改指针本身(非指向的数据),需使用指针引用: ```cpp void modifyPointer(int*& p) { p = new int(30); // 直接修改原始指针的指向 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值