一个关于c++的问题,请各位指点!!!

来源:百度知道 编辑:UC知道 时间:2024/06/22 09:07:20
这个程序的主要是想说明一下传指针的一些问题!发现自己有些地方没搞懂!
就是定义一个结构体指针然后将其以参数形式传递到一个函数中
将它再赋值为NULL 为何原来指针指向的内容没有改变,即其值不为NULL
就像下面这个程序中一样总不执行 num1==NULL 这个条件!
请各位指教!!!!!!!

#include <iostream>
using namespace std;
struct Node{
char ch; //没有使用
int num;
};
void Myswap(Node *num1,Node *num2)
{
if(num1->num > num2->num)
{ int temp=num1->num ;
num1->num=num2->num ;
num2->num =temp;
}
num1=NULL;
}
void main()
{
Node *num1=NULL;
Node *num2=NULL;
num1=new Node;
num1->num=12;
num2=new Node;
num2->num=4;
Myswap(num1,num2);
if(num1!=NULL)
{
cout<<"num1 "<<num1->num <<endl;
cout<<"num2 "<<num2->num <<endl;
}
else
cout<<"num1=NULL"<<endl;
}
mlrs618
如果是你说的这样,但是为何通过指针传递的数据在函数里面确实得到了修改????<

函数可以修改自己参数的值(初值由调用时传进),但是修改的对象只是函数内部该参数的拷贝,不是调用者的变量,即修改结果不回传给调用变量。
如void Myswap(Node *num1,Node *num2) 中修改的num1只是Myswap()里的局部变量,不会改变调用者main()里的变量num1的值。

针对你补充部分的回答:
1。注意“得到修改”并不一定意味着“交换”。
2。如果你仔细读上面回答隐含的意思,就会知道:程序运行时存在两份num1,存在不同位置,是不同的实体。一份是main()里的num1;另一份是Myswap()里的num1,初值由main()传入,后修改为NULL(在Myswap()返回后该num1消失)。
3。main()和Myswap()都只能引用自己的num1,看不到另一份num1.

是不是少了#define NULL 0这个语句啊?

针对你的补充---------------------------------------------------------你可以输出一下两个num1的地址,即cout<<&num1,两个num1并不是同一个地址。
之所以能修改你的num1所指向的值,是因为他们指向的地址所存储的内容是相同的,你把函数中num1修改为NULL,只是把函数中的num1赋成了NULL,实际num1的地址并没有改变

函数调用的时候形参是实参的拷贝,是两个不同的变量,所以在函数内部无法修改实参;
但是如果传递的是指针,则指针指向的空间是可以修改的。实参和形参相同,意思即为他们指向的是同一个地方。

引用传递可以修改实参,指针类型做实参时,交换的是就是实参。
函数里这样写:num1->num=NULL;
主函数判断语句这样写:
if(num1->num!=0)
就可以和你想的一样了。
我感觉如果你想给一个结构体对象赋值,必须重载运算符->.直接赋值好像只能在初始化的时候。