「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

関連項目