一个指针变量作为作为形参传递给一个函数后,函数返回的类型还是这个形参,为什么这个指针的地址没有发生变化?

frustrate2 2013-02-06 08:27:34
一个指针变量作为作为形参传递给一个函数后,函数返回的类型还是这个形参,为什么这个指针的地址没有发生变化?
代码如下:

class Node
{
public:
Node(void);
~Node(void);

int num;
float price;
Node *next;
};

#include "Node.h"
class Single_Link_List
{
// 创建链表,填充节点
Node* Single_Link_List::Create(Node* head)
{
Node *pCur,*pNext; // pNext指向下一个节点,pCur指向当前节点

/* 头结点,当前为都节点,都指向都节点 */
pNext = new Node;
pCur = pNext;
head = pNext;

cout<<"请输入图书编号,以0结束:"<<endl;
cin>>pNext->num;
if(pNext->num!=0)
{
cout<<"请输入图书的价格:"<<endl;
cin>>pNext->price;
cout<<"初始化: "<<head<<" : "<<head->num<<" : "<<head->price<<endl; // 测试头结点
}
else // 小于等于零,表示输入结束。说明第一次输入就是0,表示是个空链表,都删除。
{
delete pNext;
pCur=NULL;
pCur->next=NULL;
head=NULL;

cout<<head<<" : "<<head->num<<" : "<<head->price<<endl; // 测试头结点

return head;
}
while(pNext->num!=0)
{
pCur=pNext; // 将当前输入的节点保存到保存当前节点的指针,方便pNext腾出空间输入下一个节点
pNext = new Node; // 开辟很空间,pNext腾出空间输入下一个节点
cout<<"请输入图书编号,以0结束"<<endl;
cin>>pNext->num;
if(pNext->num!=0)
{
cout<<"请输入图书的价格:"<<endl;
cin>>pNext->price;
}
pCur->next=pNext;
}
delete pNext;
pCur->next=NULL;
cout<<"结束后: "<<head<<" : "<<head->num<<" : "<<head->price<<endl; // 测试头结点
return head;
}
}

Main函数:
#include "stdafx.h"
#include <iostream>

#include "Node.h"
#include "Single_Link_List.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
Single_Link_List test;
Node *p=new Node;
cout<<p->num<<" ; "<<p->price<<endl;
Node *p1=test.Create(p);
cout<<p->num<<" ; "<<p->price<<endl;
//cout<<p1->num<<" ; "<<p1->price<<endl;
test.Show(p1);
}

执行结果如下:



Node *p作为形参传递到函数test.Create(p);
Node* Single_Link_List::Create(Node* head)返回类型Node*,也就是返回*p,
为什么*p的地址还是没有变化,我在函数里面给它赋值了啊?
...全文
314 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
frustrate2 2013-02-08
  • 打赏
  • 举报
回复
引用 8 楼 pathuang68 的回复:
引用 7 楼 frustrate2 的回复: 引用 4 楼 omega_sta 的回复:函数参数,非引用传递的都是副本,函数形参head本身就是个副本,只不过这个副本(形参)指针所指向的和实参指针指向同一个位置,也就是说操作指针本身不会对实参影响,但操作形参指针所指向的内容却是有效的 你说的有道理,我搞不明白,为什么将一个申明的指针作为函数的形参传递后,再将这个指针返回,它的地址还是没有变化,……
谢谢,你讲的是最透彻,我刚学c++,以前是做c#的。
stjay 2013-02-07
  • 打赏
  • 举报
回复
问题很模糊 首先p在这里没什么用处,传NULL进去也是一样test.Create(NULL); 如何判断没有变化? 根据这两行? cout<<"初始化: "<<head<<" : "<<head->num<<" : "<<head->price<<endl; // 测试头结点 cout<<"结束后: "<<head<<" : "<<head->num<<" : "<<head->price<<endl; // 测试头结点 赋值是这个么? pNext = new Node; pCur = pNext; head = pNext; // 这里??? 那看看它们的顺序,赋值在前,判断在后,判断之间没有再修改
qiyinan 2013-02-07
  • 打赏
  • 举报
回复
如果要修改传入的指针所指向的地址,例如new操作,要用**,也就是指向指针的指针,如果只是修改传入指针所指向的地址所对应的内存里面的值,才能直接传入指针
请叫我杨二哥 2013-02-07
  • 打赏
  • 举报
回复
不想说那么多,,,一大片漏洞 好好再调戏下吧,,还有要弄清楚指针该怎么用,内存管理 很多。。不过我估计你学的不是很久吧,,加油!
Saingel 2013-02-07
  • 打赏
  • 举报
回复
函数参数,非引用传递的都是副本,函数形参head本身就是个副本,只不过这个副本(形参)指针所指向的和实参指针指向同一个位置,也就是说操作指针本身不会对实参影响,但操作形参指针所指向的内容却是有效的
caoh110 2013-02-07
  • 打赏
  • 举报
回复
这个代码错误很多呀
pathuang68 2013-02-07
  • 打赏
  • 举报
回复
引用 7 楼 frustrate2 的回复:
引用 4 楼 omega_sta 的回复:函数参数,非引用传递的都是副本,函数形参head本身就是个副本,只不过这个副本(形参)指针所指向的和实参指针指向同一个位置,也就是说操作指针本身不会对实参影响,但操作形参指针所指向的内容却是有效的 你说的有道理,我搞不明白,为什么将一个申明的指针作为函数的形参传递后,再将这个指针返回,它的地址还是没有变化,在函数内部我已经给它赋……
因为你在函数内改变仅仅是参数的副本(表面上看起来是一回事,其实不是),而非参数本身,因此函数执行完后,副本会消失,其本身根本不会改变。比如:

void fun(int x)
{
   x++;         // 此处的x就是参数x的副本,而不是参数x本身
}
这是学C/C++的人必须搞懂的一个问题,否则以后的麻烦会很多。 你用指针的引用吧。
frustrate2 2013-02-07
  • 打赏
  • 举报
回复
引用 4 楼 omega_sta 的回复:
函数参数,非引用传递的都是副本,函数形参head本身就是个副本,只不过这个副本(形参)指针所指向的和实参指针指向同一个位置,也就是说操作指针本身不会对实参影响,但操作形参指针所指向的内容却是有效的
你说的有道理,我搞不明白,为什么将一个申明的指针作为函数的形参传递后,再将这个指针返回,它的地址还是没有变化,在函数内部我已经给它赋予新地址了?
漫步者、 2013-02-06
  • 打赏
  • 举报
回复
引用 楼主 frustrate2 的回复:
一个指针变量作为作为形参传递给一个函数后,函数返回的类型还是这个形参,为什么这个指针的地址没有发生变化? 代码如下: C/C++ code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162……
你是指向了p的地址,而非new的地址。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧