ポインター型はどうしてアドレスだけで情報が扱えるのですか


ポインターはアドレス演算子で位置情報だけしか受け取っていないはずです。下のプログラムだとアドレスしか表示されません。

[code]

    cout<<&a;
    
[/code]

なのに、どうして終了する位置がわかるのですか




既に回答があるとおり「コンパイル時に既知な型の範囲で」コンパイラは情報を引き出せます。  
コンパイル時にわからない内容は別途、実行時の処理が必要です。たとえば、

[code]

    struct base { virtual void ~base(); }; // 他にも polymorphic な関数があるとします
    struct derived1 : public base { ... }; // polymorphic な関数を実装してるつもり
    struct derived2 : public base { ... }; // derived1 とは内容が異なるつもり
    extern void func(base* p);
    void tester() {
        derived1 d1; func(&d1);
        derived2 d2; func(&d2);
    }
    
[/code]

のような場合 `func` に渡される引数の真の型が `derived1` か `derived2` かは  
`func` 自体にとっては実行するまでわからないわけです。

実際の機械語でも `func` の引数 `base*` 自体には「真の型」情報は入っていません。  
(ポインタの指す先つまりオブジェクト自体には「真の型」の情報が入っていますが)

コンパイラ的には、関数 `func` 内部では型 `base` は既知なので  
\- `base` にあるメンバ変数を使うことはできます  
\- `derived1` または `derived2` 固有のメンバ変数は使うことができません  
\- `base` 中の polymorphic な関数を呼ぶと真の型のメンバ関数が呼ばれます  
\- `base` になくて `derived1` にある polymorphic な関数は使うことができません  
(`derived1` からさらに派生して使う polymorphic 関数の意味)




既に回答があるとおり「コンパイル時に既知な型の範囲で」コンパイラは情報を引き出せます。  
コンパイル時にわからない内容は別途、実行時の処理が必要です。たとえば、

[code]

    struct base { virtual void ~base(); }; // 他にも polymorphic な関数があるとします
    struct derived1 : public base { ... }; // polymorphic な関数を実装してるつもり
    struct derived2 : public base { ... }; // derived1 とは内容が異なるつもり
    extern void func(base* p);
    void tester() {
        derived1 d1; func(&d1);
        derived2 d2; func(&d2);
    }
    
[/code]

のような場合 `func` に渡される引数の真の型が `derived1` か `derived2` かは  
`func` 自体にとっては実行するまでわからないわけです。

実際の機械語でも `func` の引数 `base*` 自体には「真の型」情報は入っていません。  
(ポインタの指す先つまりオブジェクト自体には「真の型」の情報が入っていますが)

コンパイラ的には、関数 `func` 内部では型 `base` は既知なので  
\- `base` にあるメンバ変数を使うことはできます  
\- `derived1` または `derived2` 固有のメンバ変数は使うことができません  
\- `base` 中の polymorphic な関数を呼ぶと真の型のメンバ関数が呼ばれます  
\- `base` になくて `derived1` にある polymorphic な関数は使うことができません  
(`derived1` からさらに派生して使う polymorphic 関数の意味)

