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