2011-01-27 8 views
1

次のポインタ変数宣言がある場合:C++ポインタ - ここではどのような値が保持されていますか?

int *
int ** c;タイプおよびどの各々が保持する値にについて

、次のようになり:

aint*であり、そしてmemory address

*aを保持するタイプintのものであり、意志ポインタが指している変数の値を保持する

cint**であり、????????????????????

c*int*であり、そして

c**でそれを指しているポインタのメモリアドレスを保持するタイプintのものであり、そのポインタcを想定するbをポインタに指して、ポインタbを指しています変数aここでは、保持される値は変数の値になりますa

cを除いて、この方法は正しいですか?

ありがとうございました。

+0

アドレス?.... – ruslik

+3

'* c'と '** c'。 'c *'と 'c **'は意味をなさない。 – aschepler

+0

あなたのコードの後ろにある式 '(* a)'は、ポインタ 'a'をどこにでも指し示すことは決してないので、無効であると考えることが重要です。 'int'のためにメモリを割り当てたことはありません。ポインタの場合のみ。 –

答えて

7
int *a; 
int **c; 

aです。 aにはpointer to intが含まれていると言うのが一般的です。

cは、タイプint**であり、pointer to a pointer to intを保持します。

*cは、タイプint*であり、pointer to intを保持します。

**cは、タイプがintであり、整数値を保持します。 bbを指している約cは、aを指しています。

助けを借りてcdeclを参照してください。 :)

+0

たとえば、 'aがintへのポインタを保持しているとすると、' pointer'の値は何ですか?それは常に 'メモリアドレス'ですか?はるかに単純な 'メモリアドレス'を保持していると言っているのではないのですか?ありがとう – Simplicity

+1

@ user588855:実際にはメモリアドレスですが、概念的には、適切なタイプのオブジェクトを見つけるために使用できる* something *です。多くのアーキテクチャでは、ポインタは実際のメモリアドレス(ハードウェアアドレス)を保持しませんが、ハードウェアが実際のメモリバンクとそのバンク(仮想アドレス)内のアドレスにマップする異なる値を保持します。トランザクショナルメモリシステムについて考えると、トランザクションがコミットされる前後に異なるメモリアドレスを参照するために同じポインタが使用される可能性があるため、ハッシュテーブルのインデックスに使用される一意の識別子になります。 –

+0

+1の 'cdecl'。 – user470379

2

cはint **型で、???????????????????

'c'も 'a'と同様にメモリアドレスを保持します。違いは、逆参照されると 'c'が別のメモリアドレスを返すことです。別のレベルの間接参照を追加するだけです。

2

例では、cint*へのポインタを保持します。つまり、cはポインタへのポインタです。多次元配列(行列など)に使用でき、関数のパラメータとして使用してユーザのint*を変更することができます。

1

すべてのポインタがメモリアドレスを保持します。この場合、cint*へのポインタなので、そのような変数のメモリアドレスを保持します。

多くの場合、二重のポインタはCでダイナミックmultiarraysを作成するために使用されているあなたはそれhere

2

見ることができます - * int型ですが、メモリアドレス

正しい

を開催します - * aはint型で、ポインタが指している変数の値を保持します

厳密にはそうではありません:*は、アドレスが指す変数への参照になります。 * a = 8を試してみると、これが表示されます。 int * x = &(* a))。 値だった場合は変更できませんでした。しかし、それは参照であるため、値は元の場所に "ルーティング"されます...この場合はメモリがポイントします。

- cはint **型で、???????????????????を保持します。

cは、intを指すメモリアドレスを指すメモリアドレスを保持します。

* cは、intを指すメモリアドレスへの参照を保持します。そうすることができます:* c = a;

** cは* aと同じです。

1

Cの型はint *です。それから明らかなように、それはint *型のデータを保持し、それ自体がメモリアドレスです。 この概念はfarポインタと呼ばれ、一定の限界まで複数のfarポインタが存在する可能性があります。

int ** cと同様に、int *** dがint ** cを指すようにすることもできます。これは、すべてのポインタが次のポインタを指すキューのようであり、フロントはデータを実際の変数として持つ。

0

私が考えることができる最も簡単なことは、スペースで遊んでいることです。コンパイラは本当に気にしませんが、それは推論より簡単により宣言の構文と使用方法は、(設計による)と同じであるという事実になります:考える

int ***a; // declaration 

int*** a; // type of a is an int*** (read: pointer to pointer to pointer to int) 
int** *a; // the type of the object pointed by a (*a) is int** 
int* **a; // the type of **a is int* 
int ***a; // the type of ***a is int 

免責事項:これはですデータ型に関して。実行時にポインタを逆参照できないかどうかは、別の問題です(初期化されていますが、有効なメモリを指していますか?)

関連する問題