電子書籍の厳選無料作品が豊富!

初歩的な質問なんですが、

#include <stdio.h>
#include <string.h>

main()
{
char ss[10];
char *p;

strcpy(ss,"ABCDE");
p=ss;

while(*p){
*p=*p+1;
++p;
}
printf("ss=%s\n",ss);
}

で実行結果が

ss=BCDEF

になります。

while(*p){
*p=*p+1;
++p;
}

の部分がどうしても理解できません。
参考書にも、解説が載ってなくて困っています。
ご教授宜しくお願いします。

A 回答 (4件)

こんにちは




ポイントだけ説明します。

while(*p){ ←最初はssの先頭の"A"が入っていれ"E"まで繰り返します。
*p=*p+1; ←最初は"A"の文字コードに1を足したので"B"になります。以下同様
++p; ←文字の処理するポインタを1更新する為、次の文字を扱うようになります
}
    • good
    • 0

while(*p){


*p=*p+1;
++p;
}
は下記と処理内容は等価です
for (long lLoop = 0;;) {
 if (p[lLoop] == 0) break;
 p[lLoop] = p[lLoop+1];
 lLoop++;
}
    • good
    • 0

今晩は!gould09さんが回答されていますが、もう少し、詳しく見てみましょう!



参考のURLのアスキーコード表を見ますと、

文字Aのアスキーコードは16進で0x41です。
文字Bのアスキーコードは16進で0x42です。
・・・・・
p=ss;
でポインターpは配列ss[0]を指します。
その内容はAです。コードは0x41です。

*p=*p+1; この文の説明です。
右辺の*p+1は、ポインターの内容Aの値(*p==0x41)に1を加えます。
従って、右辺の内容はB(0x42)となり、
その値を*pに代入しますから、*pはB(0x42)となります。

その値を表示していますから、
ssの先頭はBとなっています。
(ss=BCDEF)

++p;はポインターを一つ進めますので、ss[1]を指します。

while(*p){はポインターの内容がNULLになるまで繰り返します。

C言語は、このポインターが理解できれば、また先が見えてきます。
頑張りましょう!!

参考URL:http://www02.so-net.ne.jp/~hat/imail/img/asciitb …
    • good
    • 0

*p=*p+1;


は分解すると、演算子の優先順位より、
*p = (*p) + 1;
となります。
この時点で左辺の*pは&ss[0]を指しています。つまり代入先の場所です。
次に、右辺の「(*p)+1」はgould09さんの説明の通り、'A'に1をたす作業、
つまり、0x41 + 0x01 = 0x42 'B'となるわけです。
    • good
    • 0

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