序文
C 言語ポインタは常に最も厄介です。この機会に C++ を学び、C 言語ポインタを復習してください。C++ は C 言語ポインタを継承し、同時にポインタ型に対してより厳密な型チェックを実行します。
1. 予備知識
ポインターを理解するために、Visual Studio のデバッグ ツールを使用してそれを確認しますが、個人的には、この方が直感的であると感じます。
古典的なポインター コード:
int main(void) {
int num = 22;
int* p = #
printf("%d", *p);
return 0;
}
まず、x86 とデバッグ モードでデバッグします。x86 モードでは、32 ビット システムです。ここでブレークポイントを
直接return 0;
設定し (開発ブレークポイントは必要に応じて設定します)、ローカルの Windows デバッガー
をクリックします。上記のデバッグ インターフェイスのアドレス: **メモリ アドレスを入力すると、対応するメモリ アドレスにジャンプできます。
上記のデバッグ インターフェイスでは、メモリを表示するウィンドウが表示されます。メモリ アドレスが次の図のように分布していることがわかります。
2. アドレスとポインタ
2.1 アドレス
C または C++ で定義された変数がメモリに格納されているかどうかに関係なく、変数にはアドレスもあります。ここでは、Visual Studio のデバッグ ツールを見てみましょう。
まずテストコードを見てください。
int main(void) {
int num = 22;
printf("%p", &num); // 打印num的地址
return 0; // 断点处
}
上記コードでは&
変数のアドレスを取り出し、%pでポインタ型そのものの値を出力していますが、その値は16進数です。
上記の事前準備された知識を使用することで、現在のメモリ状況をデバッグできます。
出力された0x010FFAA8 (追記: アドレスは実行ごとに異なります) を入力して、メモリ ウィンドウでアドレスを見つけます。
メモリ内の値を確認したい場合は、表示するバイト形式も選択する必要があります。まず、メモリ表示ウィンドウ内で右クリックし、ポップアップ ボックスに4 バイト整数を選択し、符号付きで表示します。
このようにして、0x010FFAA8
アドレスが 22 の変数の値が確認できます。したがって、アドレスは0x010FFAA8
変数 num であり、その値は 22 です。
上記のデバッグにより、変数にはアドレスがあることがわかります。番地が書かれた部屋のようなものです。
2.2 ポインタ
私の理解では、ポインタはアドレスだけでなく、int *
int 型へのポインタなどの型も含みます。
2.2.1 ポインタの定義
char* pc = NULL;
short* ps = NULL;
int* pi = NULL;
long* pl = NULL;
float* pf = NULL;
double* pd = NULL;
上記のコードからわかるように、ポインターの定義は次のとおりですtype + *
。型int * pi
へのポインタは型へのポインタです。int
char * pc
char
2.2.2 * と &
*
演算子は、ポインタが指す変数の値を取得します。
int main(void) {
int num = 22;
int* p = #
printf("%d", *p);
return 0;
}
出力:
22
*p
それ自体がそれ自体であり、本来の目的はpointer が指す値num
を取り出すことであることがわかります。&は変数のアドレスを取り出すことです。p
num
22
2.2.3 デバッグ
次に、次のコードを Visual Studio のデバッグ ツールと併用して、ポインターを特定します。
int main(void) {
int num = 22;
int* p = #
printf("%p\n", &p); // 打印指针p的地址
printf("%p\n", p); // 打印指针p的值
printf("%p\n", &num); // 打印num的地址
printf("%d", *p); // *P取出p所指向的变量的值
return 0; // 断点处
}
ブレークポイントに入ると、 、 、の値がreturn 0;
同時に出力されます。印刷結果:p
&num
*p
0078F7B8
0078F7C4
0078F7C4
22
p
以上の結果から、に等しいことが確認でき&num
、ポインタに格納されている値は のnum
アドレスであると結論付けることができます。
まず0x0078F7B8
ポインタのアドレスですので、メモリ上のポインタの位置を求め、同時にメモリデータを4バイト整数と16進数表示p
に切り替える必要があります。図に示すように、これは変数のアドレスであり、の値は(16 進数)、つまり です。このことから、ポインタの指す値が取り出されていることも分かります。0x0078F7B8
p
0x0078f7c4
num
num
22
16
*p
22
*p
p
num
22
要約する
この記事では、Visual Studio のデバッグ ツールの観点からポインターを理解しようとします。その後のコンテンツでは、同じ方法でポインターの概念を学習します。同時に、Visual Studio を使用して上記のコードを自分でデバッグすることを強くお勧めします。 !