ポインタを勉強していますが、
*p++とp++の違いがよくわかりません…
例えば、
void main(void)
{
int *p,data; p = &data; for( int i = 0; i < 10; i++ ){ *(p + i) = i; printf("%d\n",*(p + i)); p++; }
}
結果:
0
1
2
3
4
5
6
7
8
9
for文の中のp++を*p++に変更しても結果が同じで違いがわかりません…。
この問いにご教授していただけたら幸いです。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
*p++
は、*(p++)
と解釈されます。
「ポインタを1つ進めて、進める前のポインタを参照した値を返す」という演算ですが、*p++;
としてしまった場合、取得する値は使われないので、p++;
としても全く同じです。
投稿2018/09/28 05:41
総合スコア145184
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/28 06:06
2018/09/28 06:11
2018/09/28 06:43
2018/09/28 16:09
0
*p++
は以下の書き方を一緒くたにしたものです。
*p++
はmaisumakun様の説明の通り*(p++)
と同義になり、
これは以下のように分解できます。
C
1/* *p++の仕組み */ 2*p; // *と、p++でインクリメントする前のアドレスの組み合わせ 3p = p+1; // p++のインクリメント部分 4 5/** 以下と同じ仕組み **/ 6int a = 10; 7int b = a++; // int b=a; a = a+1;
なので、このままでは*p;
の処理は何も意味をなさないのでp++;
と同じ結果になります。
どういうときに*p++
を使うのかというと、以下のような場合ですね。
C
1int[] array = {1, 2, 3}; 2int *p = array; 3 4// pの指すアドレスの値(=array[0])をaに代入 5int a = *p; 6// pの指すアドレスを1つ増やす(array[0]のアドレス→array[1]のアドレス) 7p++;
このプログラムを整理すると
C
1int[] array = {1, 2, 3}; 2int *p = array; 3 4// pの指すアドレスの値(=array[0])をaに代入し、pの指すアドレスを1つ増やす 5int a = *p++;
よく間違える書き方で(*p)++
がありますが、これは結果が異なります。
こちらは単にpが指しているアドレスの値を変更するものなので、
アドレスは移動せず、値だけが変わります。
投稿2018/09/28 05:49
編集2018/09/28 11:57総合スコア5158
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/28 05:55
2018/09/28 05:59
2018/09/28 11:40
2018/09/28 11:57 編集
2018/09/28 16:07
0
*p++とp++の違いがよくわかりません
遅れ馳せながら、明確に実行結果に違いが出る例を示します。
C
1 char *p; 2 3 char *p = "hello"; 4 while (*p++) { // (1) 5 printf("%c", *p); 6 } 7 8 p = "world"; 9 while (p++) { // (2) 10 printf("%c", *p); 11 }
つまり、ループの中ではなく、ループの条件式に書く場合です。
(1) は "ello" を表示してループが終了しますが、
(2) は "orld" を表示した後もループは終了しません。私の手元ではゴミを表示して最後はコアダンプしました。
私が示した例は、ポインタが指している先のメモリを見て終端文字('\0')の所で終了することを期待するので、while (*p++)
が正しい。
一方、質問者のように、ループの中に書く場合は、ポインタ変数の値をひとつ増やす、アドレスをひとつ進める、ことが目的ですから、p++;
が正しい。
その時、ポインタが指す先のメモリをアクセスしようという意図は無いはずです。つまり参照演算子「*」は不要なのです。ポインタの値を増やすだけの目的で*p++;
と書くのは誤りです、少なくとも私的には。
投稿2018/09/28 16:53
総合スコア1380
0
ベストアンサー
*p++とp++の違いがよくわかりません
マイスマさんのコメントにも記載しましたが、
*p++
は「pの内容(すなわち*p
)を返したのち、pをインクリメントする」と解釈されます。
p++
だけであれば、pをインクリメントするだけ、になります。
似たようなものであれば、
(*p)++
は「pの内容をインクリメントして返す(アドレスは移動しない)」ですし、
*(p++)
は「先にpのアドレスをインクリメントしたあと、その内容を返す」となります。
上記、誤解しておりました。失礼いたしました。
投稿2018/09/28 06:13
編集2018/09/28 06:45総合スコア7196
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/28 06:21
2018/09/28 08:37
2018/09/28 10:21
2018/09/28 16:08
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。