Powered by SmartDoc

23 11章;ポインタ

23.1 メモリとアドレス

23.2 ポインタ概説

ポインタ;他の変数のアドレスを内容とする変数.

単項演算子&は,その変数のアドレスを与える(アンドだからアンドレスと覚える).

したがって,

p = &c;

により,変数pには,変数cのアドレスが代入される.ただし,pはポインタとして宣言された特別な変数であるとする.このとき,「pcを指す」.

単項演算子*をポインタ変数につける(例;*p)と,そのポインタが指している変数自身にアセスできる.すなわち,*pcと同値.<=重要!

ポインタ変数を宣言するときは,そのポインタが指す変数の型を明示する.

int *p; (int* p; と書いてもよい)

この式は,*pという表現がintであることを明示している.このとき,ポインタpはint型の変数を指す変数であり,その変数のアドレスを保持している.また後述するようにポインタ変数は,他の変数とは異なる振るまいをする.

リスト 23.2.1 ポインタの使用例
int n = 10;
int *ip ;

ip = &n;

このとき,*ipnは同じものであり,両者は置きかえ可能である.

printf("%p\n", ip);  ポインタの値(変数nのアドレス)を表示
printf("%d\n", *ip); ポインタが参照する変数nの値を表示

23.3 ポインタと配列

C言語では,ポインタと配列は,お互いが裏表の強い関係がある.

int a[10];
int *pa;
pa = &a[0];

ポインタpaは,(配列a[10]の先頭の要素である)a[0]のアドレスを指す.

このとき,C言語では,pa+1は,(配列a[10]の次の要素である)a[1]のアドレスを指す.C言語では,ポインタに値を足したとき,このように変化するようになっている.

このポインタと配列の裏表の関係を使って,配列の取り扱いを簡潔に書くことができる.

23.4 ポインタと文字列

C言語では文字列は,最後にNULL文字(\0)が付加された文字の配列である.したがって,文字列とポインタの間にも強い関係がある.

char amessage[] = "now is the time"; 配列amessage[]の中に文字列が記憶されている
char *pmessage[] = "now is the time"; ポインタ*pmessageは文字列の先頭のアドレスを指している.
リスト 23.4.1 教科書p290のプログラムの説明
/* 文字列sの長さを返す関数*/
int strlen(char *s)
{
  int len = 0;               /* len;文字列の長さ */
 
  while (*s != "\0' ) { /* 文字列の終端になるまでループ */
    len++;                   
    s++;                     /* ポインタsは次の文字を指す*/
  }

  return len;
}

以下は難しい話になるのでこの授業では省略.C言語の詳細は,

「プログラミング言語C」 カーニハン、リッチー著、石田晴久訳、共立出版.

参照.

23.5 ポインタと関数の引数

教科書294ページのプログラムの例

ポインタを使わない「値呼び出し」で関数を呼び出しても,元の値は変わらない.ポインタを使う「参照呼出し」で関数を呼び出せば,元の値が変わる.ポインタはこのようなところでも使われる.

23.6 ポインタ配列

省略