「ポインタの基礎」

文字列とポインタ

先に説明した通り、C言語では文字列データは文字型データの配列として表現する。
C言語ではポインタを「(配列の)先頭の位置を変更することができる配列みた いなもの」とみなして扱うこともできるので、このことを利用して 配列を扱うプログラムをもっと単純に記述できる場合がある。
特に配列の順次参照を伴う処理 (forループを使って配列の先頭から1個ずつ参照していく処理など)は ポインタを使うことで単純に記述することが多い。
例えば以前紹介した文字列のサンプルコードを もっとC言語らしく単純に記述することができる

関数string_length()をポインタを使って 以下のように記述することもできる。
関数の引数 strの型が char型の配列から char型のポインタに変わり、 whileループの条件式中で配列の値を参照している部分がポインタ変数を使っ て値を参照する表現になっている。

/* ↓以前のコード */
/*
int
string_length(char str[])
{
    int len = 0;

    while (str[len] != '\0')
	len++;

    return len;
}
*/


/* ポインタを使ったコード */
int
string_length(char *str)
{
    int len = 0;

    while (*str++ != '\0')
	len++;

    return len;
}

上記のコードは以下のようにも書くことができる。
以下のコードでは、whileループの条件式が 0を偽(false)と判定することを利用している。
ポインタ変数 strの指すアドレスの値が '\0'(= 0)以外の値である間ループを実行する。

int
string_length(char *str)
{
    int len = 0;

    while (*str++)
	len++;

    return len;
}

もう一つの関数string_toupper()も同様にポインタを使って記述することができる。
関数string_length()の場合と同様に、配列表現だった部分が ポインタ変数表現になっている。

/* ↓以前のコード */
/*
void
string_toupper(char dst[], char src[])
{
    int i = 0;

    while (src[i] != '\0') {
	dst[i] = toupper(src[i]);
	i++;
    }

    dst[i] = '\0';
}
*/


void
string_toupper(char *dst, char *src)
{
    while (*src != '\0')
	*dst++ = toupper(*src++);

    *dst = '\0';
}

上記のコードは以下のようにも書くことができる。

void
string_toupper(char *dst, char *src)
{
    while (*dst++ = toupper(*src++))
        ;
}

実行結果は同じである。

check 'A quick brown fox jumps over the lazy dog.'
length is 42
A QUICK BROWN FOX JUMPS OVER THE LAZY DOG.


文責:大津