:Node<T>* & fun( Node<T>* & p );这里同时用*和&有什么作用?

void foo_add(char* &p)
{
    *p = 'X';
    p++;
} //打印ello,(内容修改为Xello,全局指针游标移动到e)



void foo(char* p)
{
    *p = 'X';
    p++;
}//打印Xhello,(内容修改为Xello,全局指针游标没移动)

int main_cs()
{
   // char* p = "Hello";


    char *p = NULL;
    //指针变量 p 在栈中分配 4 字节
    p = (char *) malloc(100);
    //本函数在这里开辟了一块堆区的内存空间,并把地址赋值给 p
    strcpy(p, "Hello");
    //foo(p);
    foo_add(p);
   // cout << p << endl;
        LOGE("p:%c\n",p[0]);
    LOGE("str:%s\n",p);
    return 0;
}

 

 

 

 

 

 

 

 

我在数据结构中的树的实现经常用到如下方式:
Node<T>* & fun( Node<T>* & p );
请问它和:    Node<T>* fun( Node<T>* p );
         Node<T>& fun( Node<T>& p );
的使用有什么不同?请分别从形参和返回值两方面说说你的看法.

同时用函数做形参有什么用?而且是怎样使用的?如:
void PreOreder(BTreeNode<T>* & t, void visit(T item))
{
if (root !=  NULL)
{
visit(t->data);
PreOrder(t->Left(),visit);
PreOrder(t->Right(),visit);
}
}

 

谈谈我的看法如果有不对的地方还请高手指教。
   Node<T>* fun( Node<T>* p );
         Node<T>& fun( Node<T>& p );
当你的输入参数为指针时,这个很常见,就时时参传给行参的地址。既是
一个分配了内存的Node<T>地址。返回值呢,也时指向Node<T>的指针。
而用引用呢,引用就相当于变量的别名。也既是同一块内存单元Node<T>
其实也真的没什么好说的。区别你可以看看有关引用和指针对比的相关文章。
  至于指针变量的引用, 楼上已经答复了!
参量是函数,其实也既是传递的函数的地址了,和你用指向函数指针的效果是一样的!!

 

呵呵,用下面例子来学习一下用指针的引用作为形参

#include <iostream>
using namespace std;

void foo(char* p)
{
*p = 'X'; p++;
}

int main()
{
char* p = "Hello";
foo(p);
cout << p << endl;

return 0;
}
输出为 Hello
想一下为什么不是 Xello ?为什么不是 ello ?

如果把 foo 改为:
void foo(char*& p)
{
*p = 'X'; p++;
}
输出为 ello
想一下为什么不是 Hello ?为什么不是 Xello ?

至于你的代码中以引用方式返回指针,如果返回的就是 p,我看就是多此一举了。也许这样做是为了使函数可以作为表达式的左值,即你可以这样写:fun(p)->lchild = ...


Node<T>& fun( Node<T>& p );
这个东西传递和返回的是对象(的引用),不是指针

 

 

我的理解是:
char *p    其实传的是地址值,其结果是:
foo()里的p的值==main()里的p的值          //它们指向同一内存单元
但对foo()里的p执行的操作都只作用在foo()里的p上,
而对main()的p没有印象,//所以p++没有影响到main()里的p。

char *&p   结果是:
foo()里的p是对main()里的p的引用,
所有作用在foo()里的p上的操作都直接作用在main()里的p上。
所以*p实际上取的是main()里的p所指向的存储单元的内容,
    ++p实际上也是main()里的p做自加。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值