Rits Logo
立命館大学
情報理工学部
メディア情報学科

Last Update : Oct. 15, 2010

[section]第2回演習

演習課題に関して

必須課題2-3のヒント

ポインタを使った例題として,与えられた文字列を反転するというプログラムです.

文字列strが以下のように与えられるとします.

char *p2 = "Winter" ;
		

これをイメージ図で表すと以下のようになります.

p2 のイメージ図

与えられた文字列を反転するのですから,最初にすべきことは,文字列の末尾を探すことです.そこでstrと同じ場所を指すポインタp1を準備します.この部分をプログラムで書くと以下のようになります.

char *p1 ;

p1 = p2 ;
		

文字列の末尾かどうかは,ポインタp1が指している文字が,ヌル文字('\0')であるかどうかで判定します.準備したp1を文字列の後ろに向かって1つずつ移動させていきます.移動をヌル文字が見つかるまで繰り返せばいいのですから,プログラムとしては次のようになります.

while (*p != '\0') {
  /* p1の値を一つ増やす */
}
		

ポインタp1が指している文字,つまりポインタの中身(プログラム的には*p1)が,ヌル文字でない間,ポインタを1つずつ移動させているだけです.イメージとしては,以下のような感じでしょうか.

文字列の末尾を探している様子

whileループを抜けた時点で,文字列の末尾が見つかっているはずです.ポインタp1は以下の図のようにヌル文字を指しています.

p が文字列の末尾を見つけた状態

次にやるべきことは,文字列の末尾から1つずつ前にたどりながら見つかった文字を画面に出力することです.文字列の先頭はp2が指している場所だとわかっています.画面に出力するのはputchar関数を使えばいいですから,プログラムとしては次のようになります.

while (/* p1とp2のアドレスが同じでない間 */) {
  /* p1の値を一つ減らす */
  putchar(*p1) ;
}
		

ポインタp1が指しているところが,p2が指しているところと同じでない間,ポインタを1つずつ前に移動させています.それと同時に,ポインタが指している文字(プログラム的には*p1)をputchar関数を使って画面に出力しています.イメージとしては,以下のような感じでしょうか.

pを1つずつ前に移動させている様子

最後に,出力した文字列の末尾に改行を入れるために以下を追加すればプログラムは完成です.

putchar('\n') ;