2009-06-13 13 views
7

私はポインタが任意の変数のアドレスを格納しているかどうか知りたいです。ポインタにもアドレスまたはメモリ割り当てがありますか?

私が尋ねたことは、ポインタを直接使用している場合、このポインタを取得する場所がある必要があるということでした。

私は...混乱のgettinよ、助けてください。(この時(

+0

再びタグ付けポスト。ルビー?いい加減にして。 –

+1

それは、あなたが疑問に思うことはほとんどありません。 –

+0

私はあなたの質問にかなり答えてくれました。あなたに必要なものがありますか? –

答えて

4

ルックSOポインタをより良く理解するために投稿 What are the barriers to understanding pointers and what can be done to overcome them?

を限り、あなたの質問に行くと、私は理解している場合。必要であれば、基本的には、ポインタを宣言すると、システム内の各メモリユニット(通常はバイトまたはワード)に割り当てられたアドレスまたは数値インデックスを指定します。そのアドレスのメモリに格納されている値。

10

はい。それぞれのメモリアドレスを出力するためのintとコードへのポインタ。

int a; 
printf("address of a: %x", &a); 

int* pA = &a; 
printf("address of pA: %x", &pA); 

ポインタは、32ビットシステムで4バイトを占有します。 Cにおいて

3

char *p = "Here I am"; 

p次いで 'H' が格納されているアドレスを格納します。 pは変数です。あなたはそれへのポインタを取ることができます。

char **pp = &p; 

ppは今pのアドレスを格納します。 ppのアドレスが&ppなどになるようにしたい場合は

26

はい、宣言されたポインタはメモリ内に独自の場所を持ちます。上記の例では

alt text

、あなたは値 "17" を格納する変数、 'b' を、持っています。

int b = 17; /* the value of 'b' is stored at memory location 1462 */ 

あなたがその変数にのポインタを作成すると、ポインタが独自のメモリ位置に保存されているあります。

int *a; 
a = &b;  /* the pointer 'a' is stored at memory location 874 */ 

"ポインタを取得する"ことは、コンパイラの仕事です。ソースコードがポインタ 'a'を参照すると、コンパイラはそれを "メモリ位置874に格納されているアドレス値に変換します"に変換します。

注:この図は、32ビットシステムではポインタとintの両方がそれぞれ4バイトを使用するため、技術的には正しくありません。

+0

NULLフィールドへのポインタはどうですか?具体的には、再帰的抽象データ型です。 - 私はリンクされたリストについて学んでいます。リンクリストは事実上無限の数のポインタ(再帰的ノード)です。それらは記憶を取りますか?または、ヌル値がメモリを占有しないのでしょうか? – Federico

1

コンパイラは、コード内の変数を機械命令で使用されるメモリ位置に変換することを扱います。 ポインタ変数の場所は、コード内のどこで宣言されているかによって異なりますが、プログラマは通常、それを直接処理する必要はありません。

関数内で宣言された変数は、静的宣言されていない限り、スタックまたはレジスタに存在します。

トップレベルで宣言された変数は、プログラムの先頭にあるメモリセクションにあります。

ダイナミックに割り当てられた構造体または配列の一部として宣言された変数は、ヒープ上に存在します。

"&"演算子は変数のメモリ位置を返しますが、 "*"演算子とは異なり、繰り返すことはできません。

たとえば、* * iはアドレス* iの値を取得します。これはアドレス* iの値で、iに格納されている値です。コンパイラはこの値を見つけ出します。

しかし、& &私はコンパイルしません。 & iは数値で、コンパイラが変数iに使用するメモリ位置です。この番号はどこにも格納されていないので、& &私は意味がありません。

(iはソースコードで使用される&場合、コンパイラは、レジスタIに格納することができないことに注意してください。)

関連する問題