質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1664閲覧

アドレスが等しくならない ポインタ

reotantan

総合スコア295

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2015/10/23 14:33

このコードでptrポインタが示すアドレスとnumberのアドレスが同じになりません。
int *ptr=new int()が原因なのかなと考えているのですが、なぜアドレスが同じにならないのでしょうか?

コード int *ptr = new int(); ptr = &number; cout << *ptr << " " << ptr << " " << &ptr << endl; ptr = NULL; cout << ptr << endl; // const pointer (more like a reference usage) int *const ptr2 = &number; cout << *ptr2 << " " << ptr2 << " " << &ptr2 << endl;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

akiruno-oneoneさんの言う通り,この問題の核は,ptr = &ptr ではないということです(質問者様の意図が私の考えているとおりならば).
まとめましょう.

. number -> 変数.何か値を持っている
. ptr = new int() -> 空き領域のどこかにあるアドレスを持っている.
.          アドレス先にはintのコンストラクタ呼び出しより0が入っている.
.
. ptr = &number -> new int()のことはもう忘れた.
.          number変数のアドレスに夢中.どうでもよいがメモリリーク
.
. *ptr -> numberの値に注目中.参照先を表示
. ptr -> numberのアドレスに注目中.number変数自身のアドレスが表示
. &ptr -> どこかのだれかがptrのアドレスに注目中.ptr変数自身のアドレスが表示

したがって,ptr と &ptrを並べてもアドレスが同一になるはずがありません.
ptr と &numberを比較しましょう.

投稿2015/10/23 15:59

編集2015/10/23 16:02
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

以下のコードでためしてみましたが、ptrの指すアドレスは問題ないと思いますよ。

c++

1int main(int argc, char* argv[]) 2{ 3 int number = 123; 4 int *ptr = new int(); 5 6 ptr = &number; 7 8 cout << *ptr << " " << ptr << " " << &ptr << endl; 9 ptr = NULL; 10 cout << ptr << endl; 11 12 // const pointer (more like a reference usage) 13 int *const ptr2 = &number; 14 cout << *ptr2 << " " << ptr2 << " " << &ptr2 << endl; 15}

出力

123 0086F8A4 0086F898 00000000 123 0086F8A4 0086F88C

ptrとptr2の指すアドレスはnumberを指し「0086F8A4」です。
また、「0086F898」はptr自身のアドレスです。

投稿2015/10/23 15:19

akiruno-oneone

総合スコア815

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reotantan

2015/10/23 19:17

そういう事でしたか、ありがとうございました。
guest

0

ptr, ptr2 自体は異なる変数なので、 &ptr, &ptr2 の値は異なるものになります。

次のプログラムと、その実行結果は理解できますでしょうか?

c++

1using namespace std; 2 3int main(int argc, char** argv) { 4 int number; 5 int *ptr = new int(); 6 ptr = &number; 7 cout << *ptr << " " << ptr << " " << &ptr << endl; 8 9 int *const ptr2 = &number; 10 cout << *ptr2 << " " << ptr2 << " " << &ptr2 << endl; 11 12 number = 11; 13 cout << *ptr << " " << *ptr2 << " " << number << endl; 14 15 *ptr = 12; 16 cout << *ptr << " " << *ptr2 << " " << number << endl; 17 18 *ptr2 = 13; 19 cout << *ptr << " " << *ptr2 << " " << number << endl; 20 21 ptr++; // これはエラーにならない 22 // ptr2++; // const なのでコンパイル時にエラーになる 23 return 0; 24}

実行結果:

$ ./a.out 32767 0x7fff5d3d08cc 0x7fff5d3d08c0 32767 0x7fff5d3d08cc 0x7fff5d3d08b8 11 11 11 12 12 12 13 13 13

prt, ptr2 の値設定は質問文にあるもの同等です。
↑のプログラムでは, number の値を変更、 *ptr の値を変更、 *prt2 の値を変更
をした後に、 *prt, *ptr2, number の値を cout で表示しています。
ptr, ptr2 はどちらも number のアドレスを指していることが実行結果の末尾3行からも確認ができます。

投稿2015/10/24 03:59

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問