質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

861閲覧

C言語 ポインタと文字列

kazu930820

総合スコア11

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/05/24 05:12

#include <stdio.h>

int main( void )
{
char *p1, *p2;
p1 = p2 = "Winter";

while ( *p1 ) { p1++; } while ( p1 > p2 ) { p1--; putchar( *p1 ); } putchar( '\n' ); return 0;

}

上記のコードにおいて「while ( p1 > p2 )」は何を意味しているのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

アドレスの比較ですね。

最初のwhileループでp1をインクリメントさせてWinterの先頭アドレスからNULLの位置まで移動させています。
つまり最初のループが終わるとp1とp2の関係は以下のようになっています。

Winter\0
p2p1

次のループでp1をp2に向かってデクリメントさせ、Winterを逆から出力させる処理になります。
つまりループの条件はp1がp2よりも大きい間、ということになります。

投稿2019/05/24 05:28

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazu930820

2019/05/24 07:36

アドレス同士での大小の比較をすることは可能なんでしょうか?
ttyp03

2019/05/24 07:37

アドレスとは言っても中身は数値ですから可能です。
ikadzuchi

2019/05/24 13:36

> 中身は数値ですから可能 それは違います。あくまで「仕様上できることになっているのでできる」のです。(さらに言えば、できるのが自然だからできる仕様になっている) ポインタは数値とは異なる型ですから、例えば数値ではできる乗算や(ポインタ同士の)加算といった演算ができません。
ttyp03

2019/05/24 14:32

安易に数値と書くとツッコまれると思ったら案の定でした。 アドレス同士の比較は数値(int型とか)の比較と内部的に何が違うのでしょうか? C言語の仕様的なところは不得手ですので、後学のためにも教えてもらえるとうれしいです。
otn

2019/05/24 18:50

内部的にというのが実装のことなら、大小比較が符号無し整数型と同じでない実装は無いと思います。 指摘は実装の話じゃないですね。 インクリメント等その他演算は、コンパイルエラーにならないケースであっても、実装は符号無し整数型とは異なるわけなので、「中身は数値ですから可能」という表現は初心者をミスリードする可能性があります。
episteme

2019/05/25 06:39

ポインタの”中身は数値"と決めつけちゃうと ポインタ++ の説明がつかなくなっちゃうしね。 ※ 個人的には ポインタの比較は == と != 以外やっちゃダメだと思うの...
ikadzuchi

2019/05/25 07:04

(他の方が解説してくれたので特に付け加えることはないかな…)
guest

0

アドレスの大小を比較してます
p1++ と p1-- はなにをインクリメント、デクリメントしているのかわかるでしょうか。

投稿2019/05/24 05:15

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問