:Node* & fun( Node* & 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做自加。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章