サイトマップ / C言語講座>出入り口>総目次>目次:ポインタ>ポインタの新しい宣言法
/* 今回もポインタの話です。当分ポインタの学習が続きます。今回から少しづつ難しくなります。前回のソースプログラムの一部を下記に示します。
char *s; char str[ ] = "abcde"; s = str;
char型のポインタsに、strのアドレスを代入しました。
今回は少し違う方法でポインタを宣言します。
char *str = "abcdefg";
strはchar型のポインタです。
"abcdefg"はメモリのどこかに存在しますが、この際、それがどこにあるかは気にする必要はありません。上記の式によって、この文字列の先頭アドレスがstrに代入されます。
char *p, *q;
pとq は作業用のポインタです。strは配列の名前なので、文字列の先頭アドレスを保持しています。
p = q = str;
上記のコードで、そのアドレスをpとqに代入します。下記の2行のコードで文字列の先頭を指していたポインタqが、文字列の末尾のヌル文字('\0')を指すようになります。
while (*q != '\0') q++;
下記のループで、qの指しているアドレスがpのそれよりも大きいか等しければ、qの指しているアドレスの中身を画面に表示しqをデクリメントします。このループで文字列を逆順に表示します。
while (q >= p) putchar(*q--);
pとqの比較を行わないと歯止めがないので、異常な文字が表示されてしまいます。 */
#include <stdio.h> void main(void); void main(void) { char *str = "wasitacatisaw?"; /* この文字列を逆順に表示 */ char *p, *q; /* 作業用ポインタ */ printf("オリジナル: %s\n", str); /* オリジナルの文字列を表示 */ p = q = str; /* 文字列の先頭アドレスを p と q に代入 */ while (*q != '\0') /* 文字列の末尾を指すまで */ q++; /* インクリメント */ printf("反転:"); while (q >= p) /* 文字列の先頭へ達するまで */ putchar(*q--); /* 文字を表示してデクリメント */ printf("\n"); } |
/* 実行結果はいかがでしたでしょう。'?' が文末から文頭に移動しましたね。この文は回文になっています。このように読んで下さい。
"Was it a cat I saw?"
ポインタを駆使することにより、簡潔で高速に動作するコードを書くことができます。しかし、注意深くポインタを使う必要があります。例えば、ポインタを通したメモリへの書き込みで、ポインタが誤ったアドレスを指していると、他の変数やコードに誤った書き込みを行い、最悪の場合、プログラムを破壊して暴走します。 */
/* (C) 2000- YFプロ. All Rights Reserved. */ 提供:C言語講座−それ自体コンパイルできる教材を使った講座です−