サイトマップ / 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言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:ポインタ>ポインタの新しい宣言法