5 文字リテラル

最後にポインターのおもしろい使い方を示そう.おもしろいだけでなく,使い方によって はかなり便利な機能である.ここの部分は,教科書のp.285-287に記述されている内容に対応する.

ダブルクォーテーション""で囲まれた文字列を文字型リテラル(文字列定数)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 }
\fbox{実行結果}
Hello World !!

鋭い学生は,配列を使わないで,文字列を取り扱っているところに気が付くであろう. 文字列の講義では,文字列を扱うためには配列を使わなくてはならな いと述べた.そして,任意の文字列を配列に代入するためには,spfintf()あるいはstrcpy()関数を用いる必要があり,代入演算子は使えないと述べたはずである.

しかし,ここでは配列を使わないし,代入演算子で文字列を代入している.このプログラ ムの7行目は,次のように動作するのである.

このようなことから,ポインターpは,配列名と同じ働きができるのである.従って, 9行目で文字列がディスプレイに表示できる.

ポインター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 }
\fbox{実行結果}
Hello World !!
セグメンテーション違反です

配列を使った方法だと書き換え可能である.したがって,データを書き換える可能性があ る場合は,配列を使えばよい.書き換えないときは,ポインターを使った方が簡単である.



ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成19年2月16日


no counter