C言語ポインタ(1):アドレスとポインタ

序文

C 言語ポインタは常に最も厄介です。この機会に C++ を学び、C 言語ポインタを復習してください。C++ は C 言語ポインタを継承し、同時にポインタ型に対してより厳密な型チェックを実行します。

1. 予備知識

ポインターを理解するために、Visual Studio のデバッグ ツールを使用してそれを確認しますが、個人的には、この方が直感的であると感じます。

古典的なポインター コード:

int main(void) {
    
    
	int num = 22;
	int* p = #
	printf("%d", *p);
	return 0;
}

まず、x86 とデバッグ モードでデバッグします。x86 モードでは、32 ビット システムです。ここでブレークポイントを
デバッグ0
直接return 0;設定し (開発ブレークポイントは必要に応じて設定します)、ローカルの Windows デバッガー
デバッグ1
をクリックします。上記のデバッグ インターフェイスのアドレス: **メモリ アドレスを入力すると、対応するメモリ アドレスにジャンプできます。
上記のデバッグ インターフェイスでは、メモリを表示するウィンドウが表示されます。メモリ アドレスが次の図のように分布していることがわかります。
メモリとアドレス

2. アドレスとポインタ

2.1 アドレス

C または C++ で定義された変数がメモリに格納されているかどうかに関係なく、変数にはアドレスもあります。ここでは、Visual Studio のデバッグ ツールを見てみましょう。
まずテストコードを見てください。

int main(void) {
    
    
	int num = 22;
	printf("%p", &num); // 打印num的地址
	return 0; // 断点处
}

上記コードでは&変数のアドレスを取り出し、%pでポインタ型そのものの値を出力していますが、その値は16進数です。
上記の事前準備された知識を使用することで、現在のメモリ状況をデバッグできます。
デバッグ2
出力された0x010FFAA8 (追記: アドレスは実行ごとに異なります) を入力して、メモリ ウィンドウでアドレスを見つけます。
メモリ内の値を確認したい場合は、表示するバイト形式も選択する必要があります。まず、メモリ表示ウィンドウ内で右クリックし、ポップアップ ボックスに4 バイト整数を選択し、符号付きで表示します
デバッグ3
このようにして、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へのポインタはへのポインタです。intchar * pcchar

2.2.2 * と &

*演算子は、ポインタが指す変数の値を取得します。

int main(void) {
    
    
	int num = 22;
	int* p = #
	printf("%d", *p);
	return 0;
}

出力:

22

*pそれ自体がそれ自体であり、本来の目的はpointer が指すnumを取り出すことであることがわかります&は変数のアドレスを取り出すことです。pnum22

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 進数)、つまり ですこのことから、ポインタの指す値が取り出されていることも分かります0x0078F7B8p
デバッグ40x0078f7c4numnum2216*p22
*ppnum22

要約する

この記事では、Visual Studio のデバッグ ツールの観点からポインターを理解しようとします。その後のコンテンツでは、同じ方法でポインターの概念を学習します。同時に、Visual Studio を使用して上記のコードを自分でデバッグすることを強くお勧めします。 !

おすすめ

転載: blog.csdn.net/RQ997832/article/details/123910815