色彩を教える人になるための講座「色彩講師養成講座」の魅力とは>>

#include <stdio.h>
int main(void) {

char str[] = "abcde" ;

for (char* p = str; *p; ++p)
{
++(*p);
printf("%s\n", &(*p));
}



}
のプログラムが以下のような結果になる過程の処理を図など用いてどうか教えて頂けないでしょうか?
bbcde
ccde
dde
ee
f

質問者からの補足コメント

  • 特に


    for (char* p = str; *p; ++p)
    {
    ++(*p);
    printf("%s\n", &(*p));
    }

    の++pと ++(*p)の違いがよくわからず混乱しています。

      補足日時:2021/07/08 11:50
gooドクター

A 回答 (3件)

取り敢えず、表示可能な変数やポインタのアドレスは片っ端から表示とか。



#include <stdio.h>
int main(void) {
char str[] = "abcde" ;
printf("str=\"%s\", str=%p\n\n", str, str);
for (char* p = str; *p; ++p)
{
printf("for loop 1, p=%p, str=\"%s\", str=%p\n", p, str, str);
++(*p);
printf("++(*p);\n");
printf("for loop 2, p=%p, str=\"%s\", str=%p\n", p, str, str);
printf("%s\n", &(*p));
printf("for loop end.\n\n");
}
}

自分とこ、というかオンラインの環境だと、出力結果に◆付けるとして、
◆str="abcde", str=0x7ffc3899b250
が最初の状態。
質問者さんの環境で実行すれば、当然strの格納先のアドレスは変わるハズ。


1回目のforループで、
◆for loop 1, p=0x7ffc3899b250, str="abcde", str=0x7ffc3899b250
となります。

メモリに、以下のように文字列が格納されている状態。
【メモリ内容】
      +00  +01  +02  +03 +04 +05
0x~b250  61  62  63  64  65  00 abcde

pは~b250番地を指している。

◆++(*p);
で、pの指している~b250番地の値が1加算されます。
メモリ内容がどう変化したのか、上とよく見くらべて下さい。

【メモリ内容】
0x~b250  62  62  63  64  65  00 bbcde

◆for loop 2, p=0x7ffc3899b250, str="bbcde", str=0x7ffc3899b250

pの指している場所を表示します。
◆bbcde
◆for loop end.


2回目のforループで、++pされて、pの指してるアドレスが1つズレます。
◆for loop 1, p=0x7ffc3899b251, str="bbcde", str=0x7ffc3899b250

メモリ内容はさっきのまま。
【メモリ内容】
      +00  +01  +02  +03 +04 +05
0x~b250  62  62  63  64  65  00 bbcde

◆++(*p);
で、pの指している~b251番地の値が1加算されます。
上と比べて下さい。

【メモリ内容】
0x~b250  62  63  63  64  65  00 bccde

◆for loop 2, p=0x7ffc3899b251, str="bccde", str=0x7ffc3899b250

pの指している場所を表示します。
1回目のforループと違って、~b251番地からの文字列を表示します。
◆ccde
◆for loop end.


って具合で、forループの終了の条件の、pの指しているアドレスの値が00でない間処理されます。
    • good
    • 1

pがポインタの時、




++p ポインタ自体を進める(アドレス自体を型の分だけ加算する)
++(*p) ポインタが指し示す値に加算する

というのが違いです。

文字だからピンと来ないだろうから、例えば


int a = {1, 2, 3, 4, 5};
int* p;
p = a;

とでもしておいて、

++p

++(*p)

の違いを調べてみれば一発で分かりますよ。
    • good
    • 2

p:アドレス、ポインタ、住所の番地 好きに受け取ればいい


*p:そのアドレスの中身、住人

p  *p
0  a(0番地にはaさんが住んでいる)
1  b
2  c
3  d
4  e

++p:隣の番地に移動
++(*p):p番地のデータを1個増やす(aならbに)
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング