「std::outでポインタや変数のアドレスを表示する方法」の版間の差分
提供: C++入門
行75: | 行75: | ||
== 関連項目 == | == 関連項目 == | ||
* [[newとdelete]] | * [[newとdelete]] | ||
+ | * [[std::hex]] | ||
<!-- vim: filetype=mediawiki | <!-- vim: filetype=mediawiki | ||
--> | --> |
2014年8月27日 (水) 16:52時点における最新版
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