2017-02-10 12 views
-3

データ構造クラスの最近の割り当てでは、関数のパラメータリストに "* &"を使用することが予定されています。なぜこれが存在するのか、それが何であるのかに関する情報を見つけるのが難しいです。これは標準的な練習ですか?C++ *&演算子の参照先アドレス?

は、ここで私は、すべての使用「* &は」あなただけのポインタを送信できませんでした、なぜ私の質問の他の部分は、ある推測コードスニペット

template <class T> 
Thing <T> * action(const T &dataIn, Thing <T> *& thingIn) 
{ 
    if(thingIn == NULL) 
    { 
     Node <T> *newThing = new Thing <T> (dataIn); 

     newThing->ptr = thingIn; 
     thingIn= newThing ; 

     return(newThing); 
    } 
} 

ですか?それは、ポインタ上の例で

int *&ref = ptr; 

を参照型ポインティングのために使用される

+0

ポインタパラメータを参照渡しするためのものです。 –

+1

私はそれが '*&'だと疑う。それの前のタイプは何ですか? 'char *&'または 'int' *&'または何か他のもの?それともそれは 'T&'だけですか?あるいは、関数本体に '&p'のようなものがありますか?いくつかのコードを提供する必要があります。 –

答えて

2

refは次に渡すことができるintポインタptr

への参照であります関数への入力

function(int *&ref) 
1

楽しい(INT X)

楽しい

楽しい(INT * X)

楽しい

楽しい(& XをINT)

値によってINTポインタをとるint値をとります

funは参照でintをとります

fun(int * & x)

の楽しみは、参照によってint型のポインタを取る - あなたがして

struct A 
{ 
    //... 
}; 

のような例の構造機能を持っている場合は、発信者によって見られるように、Xへのポインタの値が楽しい

+0

少なくともコードブロック内にコードを入れてください。 – tambre

0

により変更することができますパラメータは、この宣言A *

void f(A * &pa); 

ように見えることができるポインタ型と&このポインタが参照によって関数に渡されることを意味します。

は、これら2つのコードは、それが参照によって関数に渡されたため、変数pが関数に割り当てられたメモリのアドレスを持つことになります関数を呼び出した後

void f(A * &pa) 
{ 
    pa = new A(); 
} 

//... 


A *p = nullptr; 

f(p); 

をスニペット比較します。

機能は、関数ポインタのコピーを扱うため、変更することはないでしょうpポインタ関数を呼び出した後、この

void f(A * pa) 
{ 
    pa = new A(); 
} 

//... 


A *p = nullptr; 

f(p); 

のように宣言されたい場合。

0

のは、このに見てみましょう:他の側に

void fun(int i) { i = 123; } 

int main() 
{ 
    int j = 0; 
    fun(j); 
    std::cout << j << std::endl; // j is still 0 
} 

void fun(int i); 

我々は値でパラメータを渡す、それは関数がその値を渡すためにint iを使用することができますが、使用されている変数を変更することができないことを意味refernceを使用すると、変数は変更されます:

void fun(int &i) { i = 123; } 

int main() 
{ 
    int j = 0; 
    fun(j); 
    std::cout << j << std::endl; // j is 123 now 
} 

ifあなたはちょうどtypedef以上の近代的なusingを使用し、より複雑な型をundestandすることができるはず、この概念を理解する:

typedef char * pchar; 
fun(pchar &p); 
fun(char *&p); // this is the same as before 

あなたが実際にあることをご理解を簡素化すべきであること、プログラムまたは少なくともあなたの心にそれを使用することができますポインタは他のものと同じ変数です。また、データ構造クラスの最近の割り当てでは

+1

文の始まりを大文字にする必要があります。 – tambre

0

などポインタへのポインタのような他の複雑なタイプを理解するのに役立ちます、我々は、我々は、関数のパラメータリストで、この「* &」を使用することを期待しています。なぜこれが存在するのか、さらにそれが何であるのかについての情報を見つけるのは難しいです。 があります。

C++宣言は、から読むとすることができます。これはポインタへの参照です。

これを使用するのは標準的な方法ですか?

実際はありません。下記参照。

「* &」という言葉を使うと、なぜポインタを送信できないのでしょうか?

参照では、参照されているオブジェクトを変更することができます。

ポインタはオブジェクトです。したがって、ポインタへの参照でポインタを変更することができます。ポインタを変更すると、のどこかを指し示すことになります。だから、関数内で*&を取ると、関数の外側にポインタが指しているところで関数が変更できることを意味します。

生ポインタの宛先を変更することは、C++で頻繁に行うことではありませんが、いつものようにアプリケーションのドメインによって異なります。

既存のポインタのデスティネーションを変更することは、Cスタイルのプログラミングのように感じるでしょう。C言語では参照がありません。*&の代わりに**を使用して、それに応じて。

関連する問題