ダブルクォーテーション""で囲まれた文字列を文字型リテラル(文字列定数)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 !! セグメンテーション違反です
配列を使った方法だと書き換え可能である.したがって,データを書き換える可能性があ
る場合は,配列を使えばよい.書き換えないときは,ポインターを使った方が簡単である.