先に説明した通り、C言語では文字列データは文字型データの配列として表現される。
C言語ではポインタを「(配列の)先頭の位置を変更することができる配列のようなもの」とみなして扱うこともできるので、これを利用して配列を扱うプログラムをより簡潔に記述できる場合がある。
特に配列の順次参照を伴う処理(forループを使って配列の先頭から1個ずつ参照していく処理など)はポインタを使うことで単純に記述することが多い。
例えば以前紹介した文字列のサンプルコードstring-test.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-test.cのもう一つの関数string_toupper()をポインタを使った書き方に変更してください。
/* ↓以前のコード */
/*
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.