2012-02-29 12 views
1

私はポインタと配列を理解しようとしています。 (しゃれ!)オンラインポインタを見つけるのに苦労した後、私はここに私の混乱.. ポインタと配列の混乱

//my understanding of pointers 
int d = 5; //variable d 
int t = 6; //variable t 

int* pd; //pointer pd of integer type 
int* pt; //pointer pd of integer type 

pd = &d; //assign address of d to pd 
pt = &t; //assign address of d to pd 

//*pd will print 5 
//*pt will print 6 

//My understanding of pointers and arrays 

int x[] = {10,2,3,4,5,6}; 
int* px; //pointer of type int 

px = x; //this is same as the below line 
px = &x[0]; 
//*px[2] is the same as x[2] 

は、これまでのところ、私はそれを得るに述べています。今私が次のことをして、pd [0]を印刷すると、-1078837816のようなものが表示されます。ここで何が起きてるの?

pd[0] = (int)pt; 

誰でも手助けできますか?

答えて

1

のint * PTをしたいと思います。整数型の変数へのポインタですが、整数ではありません。 (int)ptを指定することによって、コンパイラにptを型変換するように指示しています。

ptで変数を取得するには、* ptを使用します。これは、ptに格納されているアドレスが指す整数変数を返します。

あなたはpd [0]と言って、pdは配列ではないので少し混乱します。

+0

この文脈では、私は「http://www.osdever.net/tutorials/view/implementing-basic-paging」を読んでいました。 「ページテーブルの設定」セクションでは、unsigned long * page_tableを宣言し、forループ内でpage_table [i]を使用します。しかし、page_tableは配列ではないので、私はなぜそれがそのように使われているのか混乱しています。説明していただけますか? – rgamber

+1

配列は基本的にシーケンシャルメモリへのポインタであり、配列の各要素はポインタの可変型のサイズです。この例では、メモリ内の特定のポイントから始まる符号なしロングポインタ(4バイト)を作成した後、1024回ループして基本的に4096バイトのメモリをカバーします。配列の各インクリメントは、メモリ内の次の符号なしlongであった。 –

+0

申し訳ありませんが、私は、unsigned long pointer変数がどのように配列として使われているのか混乱しています。 「配列の各インクリメントは、メモリ内の次の符号なしlongであった」と言うが、ここで宣言された配列はなかった。助けてくれてありがとう。 – rgamber

1

ポインタptのバイトをintと同じように解釈するようにコンパイラに指示したので、メモリ内にptがどこに置かれているかを表すランダムな結果が得られます。

私はあなたが

pd[0] = pt[0] 

または

pd[0] = *pt;