• ベストアンサー

ポインタと配列

初歩的な質問なんですが、 #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; } の部分がどうしても理解できません。 参考書にも、解説が載ってなくて困っています。 ご教授宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • gould09
  • ベストアンサー率33% (196/589)
回答No.1

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

その他の回答 (3)

  • nakashi
  • ベストアンサー率51% (21/41)
回答No.4

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

  • brogie
  • ベストアンサー率33% (131/392)
回答No.3

今晩は!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/asciitbl.gif
  • selenity
  • ベストアンサー率41% (324/772)
回答No.2

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

関連するQ&A