关于对象和对象指针,涉及指向链表首结点和二叉树根结点的头指针——传指针还是传指针的指针?...

C++对象和对象指针很少被讲到,但数据结构中(如链表、二叉树)函数调用时,经常涉及到对象指针,甚至是对象指针的指针。

以链表的建立为例,当涉及到要修改链表中的结点时,那么函数参数就必须是对象指针或对象指针的指针。

例1、ListNode *Head = NULL;
    CreateList(Head);//创建链表
    PrintList(Head);//打印链表

       运行一下,结果是什么都没打印!为什么呢?CreateList的参数明明是Head,指针型啊。查阅相关资料,CreateList的参数应该是指针的指针CreateList(ListNode **node),或者是指针应用,如CreateList(ListNode *&node), 那么调用时改为CreateList(&Head)即可,运行结果输出“0到9”。不禁感叹,对象就是牛啊,修改时还需要指针的指针!!但是,这样理解对吗?凭什么对象就需要指针的指针才能修改?!且看例2.

例2、(接例1)       

change(Head);
PrintList(Head);

change函数如下:(说明:该函数仅为测试,因为知道里面有5,所以没有做边界测试以及非功能测试)

void change(ListNode *Head)
{
while(Head->value != 5)
{ Head = Head->next; }
Head->value = 55;
}

运行结果:0 1 2 3 4 55 6 7 8 9.

居然真的改了,不需要指针的指针啊!看来对象和变量类似,要想在调用函数中修改,只需将参数设为对象指针即可。那为什么例1就不可以呢?且看例3两个函数申明:

例3、

void CreateListNodeReturnNULL(ListNode** pHead) ①

ListNode* CreateListNodeReturnPointer(ListNode* pHead) ②

{
printf("Invoke CreateListNodeReturnPointer()\n");
ListNode* pPre = (ListNode* )malloc(sizeof(ListNode));
pHead = pPre;//记录了头结点的指针,将作为返回值复制给链表头结点,实现对链表头结点进行修改
if(pPre == NULL)
{
printf("memory cannot be anocated\n");
exit(0);
}
pPre->value = 0;
pPre->next = NULL;

for(int i = 1; i<10; i++)
{
ListNode* pNode = (ListNode *)malloc(sizeof(ListNode));
pNode->value = i;
pNode->next=NULL;
pPre->next = pNode;
pPre = pNode;
}
pPre->next = NULL;
return pHead;//头结点的指针,将作为返回值复制给链表头结点,实现对链表头结点进行修改
}

 

调用函数①不用说,已经成功运行。在函数②中传过来的是Head指针值的一个副本函数调用都是传副本,区别在于有的是值的副本、而有的是地址即指针的副本所以在函数②中,对于pHead值的修改,不会影响主函数中Head的值(见例1,此时是修改指针变量,即那个指针副本),但是会影响其所指向的对象的内容(见例2)。

本文总结如下:

1、函数调用都是传副本,区别在于有的是值的副本、而有的是地址即指针的副本;

2、对象和变量类似,对象指针和变量指针类似;

3、①对于头结点,如果涉及其所在内存地址修改(删除头结点)则需要修改指向其的头指针,形参需要指向指针的指针(例3,函数①)或者在主函数中通   过函数返回值(返回指针)对头指针重新复制(例3,函数②),以修改头指针;

     ②若只修该内容,形参只要是对象指针即可,是可以直接修改的,不需要涉及指向其的指针);

     ③对于链表中非头结点,形参只要是对象指针即可(例2),可以直接修改的(包括删除),通过头指针可以或者改结点的地址。

 

 

 

转载于:https://www.cnblogs.com/butcherlee/p/3598361.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值