C言語の基礎
前へ 目次へ 次へ 

3-4 ポインタと文字列

(1) 文字列

 C言語には、BASICのように文字列を処理する機能がない。例えば、BASICでは
A$ = "ABCD"

とすることで変数A$に文字列ABCDが代入できたが、C言語では

char a;
a = "abcd";

とすることはできない。なぜならばchar型変数aには1文字分のデータしか格納できないからである。
 C言語で文字列を扱うには配列を利用しなければならない。

ポインタ

 上のように(文字列の数+1)分の配列を用意し、その1つ1つに文字を代入していく。そしてC言語での約束で文字列の最後には\0(ナル文字,\0)をつけておく。

 文字列をディスプレイに表示するには次のようにする。

printf("%s\n", a);

 %sがBASICのUSING命令の"& &"に当たる。そして文字列を格納した配列名(すなわちアドレス)を出力する形にする。次の例で確認しよう。

/* sample23.c */
#include <stdio.h>
int main(void)
{
    char a[5];
    a[0] = 'a';
    a[1] = 'b';
    a[2] = 'c';
    a[3] = 'd';
    a[4] = '\0';
    printf("%s\n",a);
    printf("%c %c %c %c\n",a[0],a[1],a[2],a[3]);
}
実行結果

abcd
a b c d


(2) ポインタによる文字列の操作

 文字列を変数に代入するには配列を使わなければならないということはわかったが、1文字ずつ代入するのでは非常に不便である。
char a[5];
a = "abcd";

 C言語では、"abcd"という文字列リテラルはコンピュータ内部では、まずメモリにこの文字列が格納されて、文字列リテラル自体は、その先頭アドレスを表す。

ポインタ

 このような場合、"abcd"は1000番地ということになる。
 このアドレスの値を配列名aに代入すれば、結果的に1文字ずつ代入したものと同じことになるが、これはエラーになる。なぜなら配列名aとは、配列の先頭アドレスを示す定数だからである。定数に値は代入できない。

 ここで、ポインタを利用する。ポインタは変数であり、文字列リテラル"abcd"は先頭アドレスを表すから、次のようにできる。

char *pa;
pa = "abcd";

 次のサンプルプログラムで確認してみよう。

/* sample24.c */
#include <stdio.h>
int main(void)
{
    char *pa;
    pa = "abcd";
    printf("%s\n",pa);
    printf("%c %c %c %c\n",*pa,*(pa+1),*(pa+2),*(pa+3));
}
実行結果

abcd
a b c d


前へ 目次へ 次へ 
Copyright © 2001 Hiroshi Masuda 

 

 

inserted by FC2 system