住所、ポインタ、および参照の症状

1必要な知識

住所:唯一の変数はconstの疑似定数の定義に加えて、アドレス、定数、無アドレスを持っています。

ポインタ(TYPE):任意のデータ型がポインタを定義することができ、データ・タイプ自体へのポインタ。ポインタがそのように関係なく、アドレス(32ビットオペレーティングシステム、32ビット・アドレス)に格納されていないので、ポインタの種類は、空間の4つのバイトを占有します。

参照(TYPE&):Cで定義することができない++単独では、初期設定を定義する、変数がエイリアスです。

 

2.ポインタ作品

2.1への対応ポインタ

ポインタは最初のアドレスだけを保存し、変更ポインタ型修飾子(TYPE *)を使用して、データ型にこのアドレスを解釈することができるので、異なるデータ型、スペースが異なる占めていました。

 

例えば、分析のために:

1の#include <iostreamの>
 2  
3  の#pragma警告(無効:4996)
 4  
5  使用 名前空間STDを、
6  
7  INT ()メイン
 8  {
 9      int型値= 0x12345678の10      INT * IPTR =&バリュー;
11      のchar * CPTR =(チャー *)&値。
12      ショート * SPTR =(ショート *)&値。
13  
14      のprintf(" %08Xを\ n "、* IPTR)。
15     printf(" %08X \ n個"、* CPTR)。
16      のprintf(" %08Xを\ n "、* SPTR)。
17  
18      システム(" PAUSE " )。
19      リターン 0 ;
20 }

 

メモリに格納されたデータは、「78563412」、「78」の先頭アドレスであります

アドレスの解釈のINT(サイズ4バイト)INTポインタにIPTRポインタ小端データを除去するように、「12345678」ポインタCPTR同様の原理、1バイトのデータを取り出し、「78」SPTRポインタは「5678」、2バイトのデータを抽出し

 

同様に、作業ポインタ加算を推測することができます。

イラスト

1の#include <iostreamの>
 2  
3  の#pragma警告(無効:4996)
 4  
5  使用 名前空間STDを、
6  
7  INT ()メイン
 8  {
 9      int型値= 0x12345678の10      INT * IPTR =&バリュー;
11      のchar * CPTR =(チャー *)&値。
12      ショート * SPTR =(ショート *)&値。
13  
14      のprintf(" %08Xを\ n "、* IPTR)。
15     printf(" %08X \ n個"、* CPTR)。
16      のprintf(" %08Xを\ n "、* SPTR)。
17      のprintf(" の\ n " );
18      IPTR + = 1 ;
19      CPTR + = 1 ;
20      SPTR + = 1 ;
21      のprintf(" %08Xを\ n "、* IPTR)。
22      のprintf(" %08X \ n "、* CPTR)。
23      のprintf(" %08X \ nは" * SPTR);
 24  
25      システム(" PAUSE " );
 26      リターン 0 ;
 27 }

 

    IPTR + = 1 ;
00735096   追加          EAX、4   
00735099   のmov          DWORDのPTR [EBP-18時間]、EAXの   
    CPTR + = 1 ;
0073509Cの  MOVの         EAX、DWORD PTR [EBP-24時間]  
 0073509F   追加          EAX、1つの  
007350A2   のmov          DWORDのPTR [EBP-24時間]、EAXの   
    SPTR + = 1 ;
007350A5の  MOVの         EAX、DWORD PTR [EBP-30H]  
 007350A8   追加          EAX、2   
007350AB   のMOV          のDWORD PTR [EBP-30H]、EAX

アセンブラコードで見ることができるように、ポインタはポインタ加算タイプに従って解釈されます。

IPTR + = 1、4バイトのアドレス次いで戻り、そして、出力データ型intを説明します。

CPTR + =、戻り1バイト(最初のアドレスは「56」となる)、その後アドレスchar型は、1バイトのデータが「56」の出力をフェッチ説明します

SPTR似て... ...

 

3.参照

C ++の参照は、実際にユーザーが保存されたメモリアドレス空間を見ることができるように、ポインタパッケージの操作を簡素化へのポインタです。

イラスト

INT のmain()
{ 
    int型 NUM = 0x12345678の

    int型 * IPTR =&NUM;
    INT&IREF = NUM; 

    リターン 0 ; 
}

アセンブリコード

INT )(主
{ 
00C016F0   プッシュ        EBP  
 00C016F1   のMOV          EBP、ESP  
 00C016F3   サブ         ESP、0E8h  
 00C016F9   プッシュ        EBX  
 00C016FAの  プッシュ        ESI  
 00C016FBの  プッシュ        のEDI  
 00C016FCの  LEAの         EDI、[EBP + FFFFFF18h]  
 00C01702   MOV          ECX、3AH  
 00C01707の  MOVの         EAX、0CCCCCCCCh  
 00C0170C   担当者 STOS DWORD PTRのES:[EDI]  
 00C0170Eの  のmov          eaxに、DWORD PTRをDS:[00C0A004h]  
 00C01713   のXOR          EAX、EBP  
 00C01715   のmov          DWORD PTRの[ebp- 4 ]、EAX  
 00C01718   MOV          ECX、0C0C000h  
 00C0171D   コール        00C011FE   
    INT NUM = 0x12345678の00C01722   のmov          DWORDのPTR [EBP-0CH]、12345678hの   

    INT * IPTR =&NUM 00C01729   のLEA          EAX、[EBP-0CH]  
 00C0172C用  のMOV          のDWORD PTR [EBP-18時間]、EAX  
     INT&IREF = NUM 00C0172Fの  LEAの         EAX、[EBP-0CH]  
00C01732   のmov          DWORDのPTR [EBP-24時間]、EAXの 
 
    戻り0 ;
00C01735   XOR          EAX、EAX   
}

 

4.定数

プログラムを実行する前に、一定のデータが存在しています。constがの#defineや定数を使用して定義することができます。

#defineは実定数であり、constがコンパイラによって判断の一定の実現である、偽の定数です。コンパイラ、それは一定の値で定義されているのconst変数を発見された場合は、プログラムが一定の値に変数のすべてを置き換えます。

イラスト

書式#include <iostreamの> 使用して名前空間はstdを、INT メイン()
{ のconst int型 NUM = 0x12345678のint型 * PTR =(int型 *)&NUM。* PTR = 0x2のint型のカウント= NUM; 
    printf(" %08Xを\ n " 、NUM)。
    printf(" %08Xの\ nを"、* PTR); 
    システム(" PAUSE " );
    リターン0 ; 
}

 


     

    

    

    

 

コンパイラはnum個の前進を置き換えるので、我々は一定の値出力numはまだ変更前の値であり、変更、およびPTRによって指されているので、今、メモリ内の定数値です。

おすすめ

転載: www.cnblogs.com/Mayfly-nymph/p/11564803.html