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做自加。