2012-01-19 4 views
4

ポインタ変数に別のポインタ変数のアドレスを保持させることはできますか?例えば:
int a; int *ptr,*ptr1; ptr=&a; ptr1=&ptr;Pointer変数は別のポインタ変数のアドレスを保持できますか?

+6

'int型** ptr'が何を意味するのに動作しますか? –

+0

ポインタはアドレスを保持します。それが正しくタイプされているか(または何とかそれを偽造している)、ポインタは何が処理されているかを気にしません。ただし、ポインターはintなどではなく、ポインターを指定して入力する必要があります。 –

+1

@HotLicks:これは一般的な実装では当てはまりますが、原則的にではなく公式言語ではありません。間違ったポインタ型を介してポインタをキャストして戻って同じ値を返すことは保証されません。実際には、特定のアラインメントの考慮事項などがあるマシンでは、そうでないかもしれません。あなたは本当に正しいポインタ型が必要です。あるいは、ポインタを安全に保持できる文字型ポインタまたは 'void'ポインタを使用することができます。 –

答えて

10

確かに、ポインタへのポインタ。

int i; 
int *pi = &i; 
int **ppi = π 

ポインタへのポインタに関して特に珍しいことはありません。これは他の変数と同じように変数であり、他の変数と同様に変数のアドレスを含みます。正しい型を設定するだけで、コンパイラはそれらと何をするべきかを知ることができます。

+0

'ptr'と' ptr'はあなたの例では同じ名前なので、型の不一致( 'int **' vs 'int ***')がコードを無効にします。 –

+0

そうです。これがコンパイラなしでコーディングするためのものです。一定。 –

3

はい、それは正しい型を持っている必要があります。あなたの例ではint *ptr,*ptr1;ptrptr1の両方が唯一int、ないポインタを指すことができますタイプ「intへのポインタ」を、持っています。あなたがint *ptr, **ptr1;を宣言した場合、ptr1は「int *へのポインタ」と入力しているので、ptrを指すことができます。

0

ポインタへのポインタは可能ですが(非常に一般的ですが)int*は、別のint*のアドレスを格納するのに十分なほど大きくない場合があります。 int**を使用してください。 (またはvoid*、一般的にポインタに)

+0

サイズの問題ではありません。 'int *'は間違った型です。 –

1

は、ここでそれはint ***ptrint ****ptrで同じ作品

int a = 13; 
int *ptr, 
int **ptr1;  // ** means pointer to pointer 
ptr = &a; 
ptr1 = &ptr; 

cout << a;  //value of a 

cout << *ptr;  //ptr points to a, *ptr is value of a 
cout << **ptr1; //same as above 

cout << &ptr;  //prints out the address of ptr 
cout << *ptr1; //same as above 

何が起こるかを示すサンプルです。

0

ここには2つの回答があり、両方ともはいです。 **、

int型のx = 2、Y = 3、* P = & X:

つのポインタは、あなたはまた、ポインタへのポインタを持つことができ、同じ場所

int b, *p1=&b, *p2=&b; 
*p1 = 123; 
*p2; // equals 123 

を指すことができますq =&p;

余分なアスタリスクに注意してください。

**q; // equals 2 
*q = &y; 
**q; // equals 3 
**q = 4; 
    y; // equals 4 
0

はい、 PLSのは、次のコードを参照してください。私は

int a = 4; 
int *ptr = &a; 
int *ptr1 = (int*)&ptr; 
cout << **(int**)ptr1; 

それはあなたの目的を果たすことを願っています。ここPTR1は単一のポインタであるが、二重のポインタとして

関連する問題