2017-09-14 10 views
1

のは、私はこのようなポインタへのポインタをとる関数を持っていると仮定してみましょう:一時的な指針を作成することなく、関数へのポインタへのポインタを渡す

void foo (int** p){ 


// do stuff 

} 

私の質問は、私はこれへのポインタへのポインタを渡すことができる方法であります一時的なポインタを作成せずに関数?

// sample code: 
int a=10; 
int* pa=&a; // temporary pointer 
foo (&pa);  // passes a pointer to pointer , but requires a temporary pointer 

foo (&&a);  // this does not compile 

これを達成するにはどうすればよいですか?

+1

標準C++にはありません。 – StoryTeller

+2

一時的なポインタを持っていない場合、pは何を指すべきですか? – UKMonkey

+1

あなたは何を期待していますか?関数に渡される各引数の型は、通常、関数が期待する型と一致していなければなりません。 – Peter

答えて

1

これはできません。 int**は、int*の値を保持するメモリセルを指します。このメモリセルは、明示的に割り当てられる必要があります。

ただしそれを行いますインライン関数やマクロにfoo呼び出しをラップすることができます:

inline void foo_(int* p) { int** p2 = &p; foo(p2); } 

#define foo_(p) do { int* p1 = p; int** p2 = &p1; foo(p2); } while(0) 
+1

#defineをインライン関数の置換として提案するべきではありません。実用的ではなく、C++に似ています。コンパイラにインライン展開する – R2RT

2

を一言で言えば、ありません。あなたは存在しないもののアドレスのアドレスを持つことはできません。そのため、アドレスへのポインタを宣言し、そのポインタのアドレスを取得する必要があります。

Address Value Symbol 
0x20  0xFF a 
0x30  0x20 pa 

あなたは一緒に連鎖するように考える必要があります。 paには、aのアドレスを指す値が含まれています。 paがない場合、aへの間接参照がないため、値とアドレスがaのため、アドレスへのポインタを取得できません。それは理にかなっていますか?

あなたは自分自身を指摘することはできませんが、実際にはあなた自身であるが、他の誰かがあなたを指すことができるように考える。

関連する問題