2010-11-22 9 views
1

私がこれまでに教えたように、ポインタはメモリアドレスが格納されているメモリ(ヒープ)内の場所ですが、実際にはそれを理解していて簡単に処理できますが、サイズはコンピュータのメモリのサイズと対称ですしたがってすべてのポインタのサイズは同じです、次にポインタには型があります。ポインタXが整数の場合、poiterと同じサイズですYはcharと定義されていますが、doubleのアドレスまたはintegerの任意の型のアドレスをXに代入すると、コンパイラやランタイムエラーが発生するのはなぜですか?Yには同じですか?型を決定するポインタの構造に追加のコンポーネントがありますか?ポインタの実際の構造は何ですか?

私は、ポインタの実際の構造、正確に動作するかどうか、そしてその理由を知りたいだけです。事前に

感謝:)

注:私は、言語を指定する必要がある場合、それはあなたが正しいC++

答えて

3

だ、ポインタのみがメモリアドレスを含み、その与えられた上のすべてのポインタマシンはまったく同じサイズです。

タイプと対応するコンパイラエラーは、一貫したコードの作成に役立ちます。しかし、いったんコードがコンパイルされると、ポインタのメモリ構造には何もそのタイプについて何も伝えられません。

-1

ポインタがスタックに格納されていて、ヒープ上の場所を指していると思ったのですが?

ポインタには、型の安全性を提供する変数と同様の「型」があり、コンパイル時に問題を解決することができます。しかし、これはコンパイル時(Cではとにかく)でしかないことに注意してください。

実際には、コードを介してポインタを任意のメモリロケーションに設定することができます。これが、コードやウィルスが悪用する脆弱性に多くの問題を引き起こします。ポインタを使用して配列に沿って歩くことは一般的なトリックですが、これはポインタが配列の終わりを越えて歩き回って、期待していないメモリの部分にアクセスして変更することができます。

+0

ポインタは、コンパイラがアドレスとして解釈する値です。ヒープ上、スタック上、または一時的にレジスタに格納することができます。そして、配列の終わりから外れる可能性を持たせるためのポインタは必要ありません。インデックスを使って簡単に行うことができます。 –

+0

まあ、新しいことを学ぶ。 –

0

ポインタが初期化されるとき、それが指すデータの最初のバイトを指します。例えば、intポインタがデータを指している場合。 45の場合、ポインタは値4または5を指している可能性があります(マシンの終了不能に応じて)。同様の方法で、ダブルポインタは、それが指しているデータのメモリ内の第1バイトを指し示す。

このように、すべてのポインタは同じサイズです。

ここで、ポインタの種類に応じて、メモリからのデータにアクセスします。したがって、intが16ビットである16ビットコンピュータでは、このポインタが参照解除されたときにメモリから2バイトのデータが参照されます(ポインタが指すメモリからの次の即値バイトを含む)。同様の方法で、長いポインタが逆参照されると、4バイトが参照される。

これは、一般に、ポインタ逆参照が一般的に機能する方法です。したがって、要するに、ポインタは、データを正しく逆参照するための型を持っています。そして、全てのポインタは本質的に同じサイズ、すなわち1バイトを本質的に有する。私は十分に明確です。

1

ポインタの実際の構造はわかりません(私はこのアイデアが気に入っていますので、オートマトンの理論やプログラミング言語の設計やコンパイラーのトピックで何かを見つけることができると思います)しかし、私はポインタがデータ型を持っていると思うので、コンピュータがどれだけのメモリをポイントしているのかを知っている、つまりダブルポインタを考えると、ポインタはサイズの最初の単語のアドレスを指していると思うdoubleが必要ですが、ポインターに指定された値と一致するタイプがない場合は、画面上にダブルを出力したいと考えています。

関連する問題