2016-08-08 13 views
0

特定の型のポインタを宣言している間に実際にはどうなりますか?ポインタの算術演算または索引付け以外の型にポインタを指定する用途はありますか?ポインタ型を指定する理由は何ですか?

+4

タイプがないと、ポインタの意味をどのように知ることができますか? – RedX

+0

場所が割り当てられているデータの種類を知らなくても、ポインタを使用してメモリの場所にデータを書き込む方法はありますか? – haccks

+1

関連または重複:[C++でポインタ変数と参照変数の違いは何ですか?](http://stackoverflow.com/q/57483/514235) – iammilind

答えて

2

タイプは、ここで

ポインタ

  • ポインタ演算を間接参照状況

    • を以下で必要とされるポインタを逆参照の一例です。

      { 
          char *ptr; //pointer of type char 
          short j=256; 
          ptr=&j; // Obviously You have to ignore the warnings 
          printf("%d",*ptr) 
      } 
      

      今では1バイトのみを読み込みますので、ptrはchar型であるため。しかし、256のバイナリ値は0000000100000000ですが、ptrのタイプはcharなので、最初のバイトだけが読み取られるため、出力は0になります。

      注:j = 127を指定すると、127が最初のバイトで保持されるため、出力は127になります。今

      pointer arithmeticの例:文var++

      { 
          int *ptr; 
          int var=0; 
          ptr=&var; 
          var++; 
          ptr++;// pointer arithmetic 
      } 
      

      され、ptr++は同じものですか。 No、var++は、var=var+1を意味し、ptr++は、ptr=ptr+4を意味する。コンパイラはこれがポインタであり、ポインタがintを指しているので、4を1の代わりにptrに追加するので、ポインタは次の整数を指します。

  • 9

    ポインタを間接参照すると、読み込むバイト数がわかるはずです。 Dereferencing charポインタは、メモリから1バイトを受け取ることを意味し、intの場合、それは4バイトであり得る。

    +0

    それはすべてですか?私は答えが "あなたが持っているから"と思った。 - auto x = * ptr; '、' func(* ptr); '... – LogicStuff

    +0

    @LogicStuffごめんなさい。欠けていると感じたら、別の答えを加えることを検討してください。私はまた、主にCの観点からこの質問に答えました。なぜなら、その質問もそのようにタグ付けされていたからです。 –

    +0

    ああ、それでは。私は、単にその質問の最初のコメントが何を言っているのかを言っていただけです。 – LogicStuff

    0

    データ型は、ポインタを逆参照して読み込む必要のあるデータ量を知るために必要です。

    例:charポインタの参照解除は、指しているアドレスから次のバイトを読み取るべきですが、intポインタは2バイトを読み取る必要があります。

    以上のためにこれを参照してください。Why is it necessary to declare the types that pointers point to?

    1

    ポインタはその値がここでは別の変数

    のアドレスであるポインタ型のためのいくつかの例は、可変である。

    int *ip; /* pointer to an integer */ 
    
    double *dp; /* pointer to a double */ 
    
    float *fp; /* pointer to a float */ 
    
    char *ch  /* pointer to a character */ 
    

    実際のデータ・タイプ整数、浮動小数点数、文字数などのすべてのポインタの値のうち、メモリアドレスを表す長い16進数は同じです。

    異なるデータ型のポインタとの間の唯一の違いは、データ変数の型または

    +0

    これはすべて定義に適しています。データ型を知っているときに得られるのは、ポインタの使用法に関するものです。 –

    +0

    "すべてのポインタの値の実際のデータ型、...は同じです"。それは(必ず)真実ではありません。ワードでアドレス指定されたマシンは、ワードのアドレス(通常は整数、浮動小数点、および構造ポインタを扱う)に1つのデータ型を使用し、ワードのアドレス+ワード内のオフセット(charポインタとボイドポインタ)。セグメント化されたアーキテクチャーでは、 "関数へのポインタ"に異なる型を使用することが多く、 "メンバー関数へのポインター"/"メンバー関数へのポインター"というまったくの楽しいゲームやゲームがあります。 –

    0

    ポインタへのポインタポイントは、クラスの有効なオブジェクトを指していることを定数です。タイプがない場合、クラスのメンバーにアクセスするための情報を取得できません。ポインタの

    class CPerson 
    { 
        public: 
         std::string GetName(); 
    }; 
    
    CPerson oPerson; 
    CPerson *pObj_1 = &oPerson; 
    pObj_1->GetName(); 
    
    void *pObj_2 = &oPerson; 
    pObj_2-> ?? // what all I can access now ? 
    
    1
    • サイズ:何バイトにアクセスしますか? 1バイトのcharの読み取り/書き込みは、long以上の4オクテットの書き込みと同じではありません。
    • アライメント:2つのタイプは同じ長さであるかもしれないが、異なるアラインメントを有する。 1つのデータ型は特殊なレジスタに入れられ、これらのレジスタから/へのメモリの移動は特殊なアライメント要件を持ちます。
    • 表記:同じsizeofおよび_Alignofであっても、表記が異なる場合があります。 *float_ptr = 4を割り当てた場合、44.0に変換されます。
    • タイプ安全void **ptr1, **ptr2; *ptr1+*ptr2;のようなグロス違反が検出されます。
    関連する問題