「std::outでポインタや変数のアドレスを表示する方法」の版間の差分
提供: C++入門
(ページの作成:「C++ で変数やポインタのアドレスを表示するには、std::coutとstd::hexを利用します。coutとprintf() (stdout)が混在するとバッファ...」) |
|||
行26: | 行26: | ||
== ポインタに格納されたアドレスを表示する == | == ポインタに格納されたアドレスを表示する == | ||
− | + | newでメモリを確保した変数 p2 に格納されているアドレスを表示する方法は、以下の通りです。 | |
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
− | void * | + | int *p2 = new int(0); |
− | cout << hex << | + | cout << hex << p2 << endl; |
+ | </syntaxhighlight> | ||
+ | |||
+ | 変数 p1 に格納されているアドレスを表示する方法は、以下の通りです。 | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | void *p1 = std::malloc(sizeof (int) ); | ||
+ | cout << hex << p1 << endl; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
行43: | 行49: | ||
int main(int argc, char const* argv[]) | int main(int argc, char const* argv[]) | ||
{ | { | ||
− | void * | + | void *p1 = std::malloc(sizeof (int) ); |
+ | int *p2 = new int(0); | ||
int i = 0; | int i = 0; | ||
− | cout << hex << | + | cout << hex << p1 << endl; |
+ | cout << hex << p2 << endl; | ||
cout << hex << &i << endl; | cout << hex << &i << endl; | ||
− | std::free( | + | |
+ | delete p2; | ||
+ | std::free(p1); | ||
return 0; | return 0; | ||
} | } | ||
+ | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== コンパイル == | == コンパイル == | ||
行59: | 行70: | ||
$ ./std_hex1 | $ ./std_hex1 | ||
0x801c06058 | 0x801c06058 | ||
− | + | 0x801c06060 | |
+ | 0x7fffffffd68c | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== 関連項目 == | == 関連項目 == |
2014年7月6日 (日) 22:03時点における版
C++ で変数やポインタのアドレスを表示するには、std::coutとstd::hexを利用します。coutとprintf() (stdout)が混在するとバッファリングによって、出力の順序が保証できなくなります。
読み方
- std::hex
- えすてぃーでぃー へっくす
- std
- :cout:えすてぃーでぃー しーあうと
- printf
- ぷりんとえふ
概要
C言語では、ポインタのアドレスやメモリのアドレスを表示するときに、
printf("%p\n", ptr); printf("%p\n", &i);
のように、printfと%pを使用していました。
C++では、std::coutとstd::hexを使用して、同様のことを実現できます。
C言語の関数であるprintf()を使うとC++っぽくなくなる、というのが問題なのではなく、coutとprintfがそれぞれバッファリングして、出力の順番が保証できなくなります。
変数のアドレスを表示する
変数iのアドレスを表示する方法は、以下の通りです。
int i = 0; cout << hex << &i << endl;
ポインタに格納されたアドレスを表示する
newでメモリを確保した変数 p2 に格納されているアドレスを表示する方法は、以下の通りです。
int *p2 = new int(0); cout << hex << p2 << endl;
変数 p1 に格納されているアドレスを表示する方法は、以下の通りです。
void *p1 = std::malloc(sizeof (int) ); cout << hex << p1 << endl;
ソースコード
/* * std_hex1.cpp * Copyright (C) 2014 kaoru <kaoru@bsd> */ #include <iostream> using namespace std; int main(int argc, char const* argv[]) { void *p1 = std::malloc(sizeof (int) ); int *p2 = new int(0); int i = 0; cout << hex << p1 << endl; cout << hex << p2 << endl; cout << hex << &i << endl; delete p2; std::free(p1); return 0; }
コンパイル
$ c++ std_hex1.cpp -o std_hex1
実行例
$ ./std_hex1 0x801c06058 0x801c06060 0x7fffffffd68c