「std::outでポインタや変数のアドレスを表示する方法」の版間の差分

提供: C++入門
移動: 案内検索
(ページの作成:「C++ で変数やポインタのアドレスを表示するには、std::coutとstd::hexを利用します。coutとprintf() (stdout)が混在するとバッファ...」)
 
行26: 行26:
  
 
== ポインタに格納されたアドレスを表示する ==
 
== ポインタに格納されたアドレスを表示する ==
変数 p に格納されているアドレスを表示する方法は、以下の通りです。
+
newでメモリを確保した変数 p2 に格納されているアドレスを表示する方法は、以下の通りです。
 
<syntaxhighlight lang="cpp">
 
<syntaxhighlight lang="cpp">
void *p = std::malloc(sizeof (int) );
+
int *p2 = new int(0);
cout << hex << p << endl;
+
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 *p = std::malloc(sizeof (int) );
+
         void *p1 = std::malloc(sizeof (int) );
 +
        int *p2 = new int(0);
 
         int i = 0;
 
         int i = 0;
         cout << hex << p << endl;
+
         cout << hex << p1 << endl;
 +
        cout << hex << p2 << endl;
 
         cout << hex << &i << endl;
 
         cout << hex << &i << endl;
         std::free(p);
+
 
 +
        delete p2;
 +
         std::free(p1);
 
         return 0;
 
         return 0;
 
}
 
}
 +
 
</syntaxhighlight>
 
</syntaxhighlight>
 
== コンパイル ==
 
== コンパイル ==
行59: 行70:
 
$ ./std_hex1
 
$ ./std_hex1
 
0x801c06058
 
0x801c06058
0x7fffffffd6b4
+
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

関連項目