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によって指されているので、今、メモリ内の定数値です。