ダブルクォーテーション""で囲まれた文字列を文字型リテラル(文字列定数)3と呼ぶ.この文字型リテラ
ルを使うと,その文字列がメモリーのどこかに格納されて,その先頭アドレスを返す.実
際の例を,リスト7に示す.たぶん,プログラムを見れば,その結果は
予想できるであろう.
1 #include <stdio.h> 2 3 int main(void){ 4 5 char *p; 6 7 p="Hello World !!"; 8 9 printf("%s\n", p); 10 11 return 0; 12 }
Hello World !!
鋭い学生は,配列を使わないで,文字列を取り扱っているところに気が付くであろう. 文字列の講義では,文字列を扱うためには配列を使わなくてはならな いと述べた.そして,任意の文字列を配列に代入するためには,spfintf()あるいはstrcpy()関数を用いる必要があり,代入演算子は使えないと述べたはずである.
しかし,ここでは配列を使わないし,代入演算子で文字列を代入している.このプログラ ムの7行目は,次のように動作するのである.
ポインターpは,配列名と同じなので,
printf("%c",p[0]);として,Hの文字を表示することも可能である.
ただし,配列と異なりこの方法では,ポインターが指し示すアドレスの値を書き換えるこ
とは,大抵の場合,許されない.例えば,リスト8のように値を
書き換えるプログラムではコンパイルはできるが,実行時に「セグメンテーション違反で
す」とエラーが発生する.リテラル(定数)は,書き換えが許されないアドレスにデータ
が格納されるからである.
1 #include <stdio.h> 2 3 int main (void) 4 { 5 char *p ; 6 7 p="Hello World !!"; 8 printf("%s\n", p); 9 *(p+6)='A'; 10 *(p+7)='k'; 11 *(p+8)='i'; 12 *(p+9)='t'; 13 *(p+10)='a'; 14 printf( "%s\n", p); 15 16 return 0 ; 17 }
Hello World !! セグメンテーション違反です
配列を使った方法だと書き換え可能である.したがって,データを書き換える可能性があ
る場合は,配列を使えばよい.書き換えないときは,ポインターを使った方が簡単である.