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

#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;
}

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

このQ&Aに関連する最新のQ&A

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で質問しましょう!

このQ&Aと関連する良く見られている質問

Qfor(s=p; *p; p++)の*p(ポインタ)の意味

for(s=p; *p; p++)の*p(ポインタ)の意味
C言語初心者です。
今ポインタを勉強しているのですが、
for文で上記のようなものが出てきて、意味が分からず困っています。
*pで*p != NULL と同じような意味になるみたいなのですが…。
どうしてそのような意味になるのでしょうか?

ちなみにsとpはポインタで、
sには配列(入力した文字列)の先頭アドレスが入っています。
pは文字列を指していて○○○○○NULL ←になるから上記のような条件で
回るんだろうなぁとはなんとなく考えているのですが。

Aベストアンサー

念のため:
ヌルポインタは「ビットパターンとして」0 じゃないかもしれませんが, ソースプログラムにおいて「ポインタが要求される場面」で「0」とあれば, それは「ヌルポインタ」です.
もうちょっと厳密に書くと「整定数 0」はヌルポインタに変換される.

Q「char* p」と「char *p」は何が違うのでしょうか

「char* p」と「char *p」の違いを教えてください。

Aベストアンサー

同じ意味です。
ただ、
char* p, q;
と書いた場合、一見char*型のpとqを定義しているように見えるかもしれません。
しかし、実際はchar*型のpとchar型のqを定義しています。
意図とは違うことが起きるかもしれません。

したがって、私は、型名の最後ではなく変数名の頭に*を付ける
書き方を採用しています。

Qchar *str; と char* str;

char *str; と char* str;
どっちも同じことを意味しているんですか?

Aベストアンサー

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染むのでしょう。ちなみにそういう風な人たちは

char *str1, *str2;

とは、書けない体になっています。

char* str1;
char* str2;


変数の宣言だと、C に慣れていれば、char* str というのはちょっと違和感があるのは
私も分かりますが、関数のプロトタイプ宣言だと、どちらの方がすっきりしますか?

extern char *memcpy(char *, const char *);

extern char* memcpy(char*, const char*);


# まあ、どっちが正しい、っていうんじゃ無いんですよね

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染む...続きを読む

Qchar c = 'a'; char h[1] = c; エラー

char型のものを char[]型に代入したいです。

char c = 'a';
char h[1] = c;

として、

h[0] は \x97
h[1] は \x00

にしたいです。
型変換の方法を教えてください。

Aベストアンサー

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数を確保します。
後半で、その中を初期化しています。
添え字は 0 からはじまるので、この場合、h[0] に c の内容が代入されます。
1個しか場所を確保していないので、 h[1] の位置のデータは内容が不定です。
文字列として h を扱いたいのであれば、 C の文字列には終端として 0 が必要ですから、
char c = 'a';
char h[2] = { c, '\0'};

のような書き方が必要になります。
これで、お望みのデータになると思います。

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数...続きを読む

Qp = (char **)*p の意味

C言語を勉強中です。
ネットで以下のような記述の資料がありました。
どういうことなのかわかりません。
ポインタについて理解しているつもりでいましたが、理解してなかったということのでしょうか。。。
なお、pがポインタとして宣言されているか、値として宣言されているかどうかについては記述がありませんでした。
これだけを見て、理解できる方がいれば、教えてもらえると助かります。

------------------------------------------------------------------------------
レイテンシの算出方法は、以下に示すアドレス更新処理を多数回実行することで行っている。
p = (char **)*p
レイテンシ時間=測定時間 / 実行回数 により算出される。
-------------------------------------------------------------------------------

Aベストアンサー

これ、ベンチマークテストかなんかのですかね?
・pに(char **)でキャストした内容を代入しているので、 char **pと予測される
・↑だとすると *P はchar *型になる。

・*pでpのアドレスからポインタ1つ分のデータ読み出す。
・↑はchar*型なので、char **にキャストしてpに代入する。→pが別のアドレスを示すようになる
・その「別のアドレス」からポインタ1つ分のデータ読み出す
...
とpの内容をメモリから「読み出して代入」を繰り返すもののようです。


このカテゴリの人気Q&Aランキング

おすすめ情報