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

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

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

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

Q&A

4回答

3649閲覧

*p++ = *q++;の流れ

reotantan

総合スコア295

C++

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

0グッド

0クリップ

投稿2015/11/06 20:18

*p++ = *q++;の流れは*qが*pに代入されpに1足されqに1足されるとあったのでコードを書いてみたのですが、
予想していたものと別の結果になってしまいました。
4、4という数字という結果になり、混乱しています。
ポインタにアドレスを格納して、aやbの実際の数(*p、*q)に++しているのに値が変わっていないのが納得できません。

コード *p++ = *q++; int *p; int *q; int a=10,b=4; p=&a,q=&b; *p++ = *q++; cout<<a<<b; }

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

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

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

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

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

guest

回答4

0

たぶん、やりたい事は

*p++

ではなくて

(*p)++

じゃないでしょうか?

前者は*pの値ではなくポインタpが(データのサイズ分)進むだけです。

後者は*p に +1 されます。

まずは、 * と ++ について、演算子の優先順位を確認してみてください。

投稿2015/11/06 21:39

編集2015/11/06 21:51
T.Kanno

総合スコア915

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

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

0

p=q
→p++, q++
になるのですが・・・難しいのは、ポインタの評価順と後置演算子の組み合わせになっている事です。
このページにも
(p++)=
(q++)と等価だと説明している所がありますが、後置である事を忘れるとアドレスの加算が先に実行されるような錯覚をします。実際は、ポインタの値を評価してその中身を更新した後、(後置のため)アドレスの加算が行われます。

投稿2015/11/07 13:07

cateye

総合スコア6851

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

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

0

*p++ = *q++;の流れは*qが*pに代入されpに1足されqに1足される

書かれているとおりで、順番に分解すると
*p = *q; // *qが*pに代入され
p++; // pに1足され
q++; // qに1足される
となります。
ですので、++はポインタp/qに対して1加算されるためアドレスが変化するだけで、p/qが示していた先にあるデータ(a/b)には影響しません。

投稿2015/11/07 12:54

toki_td

総合スコア2850

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

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

0

*p++ = *q++; の動作を見る為に、次のようなコードをかいてみました。

c++

1#include <iostream> 2using namespace std; 3 4int main() { 5 int *p; 6 int *q; 7 8 int ary_a[] = {1, 2, 3}; 9 int ary_b[] = {10, 20, 30}; 10 11 p = ary_a, q = ary_b; 12 13 *p++ = *q++; 14 15 for (int i = 0; i < 3; i++) { 16 cout << ary_a[i] << ", "; 17 } 18 cout << endl; 19 20 for (int i = 0; i < 3; i++) { 21 cout << ary_b[i] << ", "; 22 } 23 cout << endl; 24 25 cout << "*p =" << *p << endl; 26 cout << "*q =" << *q << endl; 27}

実行結果

$ ./a.out 10, 2, 3, 10, 20, 30, *p =2 *q =20

*p++ = *q++;
の実行後は次のようになっていることがわかります。
p は &ary_a[0] -> &ary_a[1] に変化した。
q は &ary_b[0] -> &ary_b[1] に変化した。
ary_a[0] は ary_b[0] の値と同じになった。

*p++ = *q++; という書き方は、配列のコピーをするときに使われることがあります。

p = ary_a, q = ary_b; for (i = 0; i < 3; i++) { *p++ = *q++; }

↑の例では、 ary_b の先頭の3要素が ary_a の先頭の3要素と同じになります。

投稿2015/11/06 21:16

編集2015/11/07 22:36
katoy

総合スコア22324

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

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

reotantan

2015/11/07 19:48

なるほどそういう事でしたか。 コードは左から右に読まれるという事ですよね?(pの++がqの++より先に作動するため)
katoy

2015/11/07 22:41

> pの++がqの++より先に作動する うーん、ちょっと違います。 *p++ = *q++ は、次と同じになります。 *p = *q q++; p++; 回答に書いたコードを書き換えて実行することで、確認ができるはずです。
reotantan

2015/11/08 08:54

なるほど、結局qポインタの示す値をpポインタの示す値にコピーし、両方のポインタを1進ませるという事ですね。 何度も質問してすいません、やっと理解できました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問