ポインタ;他の変数のアドレスを内容とする変数.
単項演算子&
は,その変数のアドレスを与える(アンドだからアンドレスと覚える).
したがって,
p = &c;
により,変数p
には,変数c
のアドレスが代入される.ただし,p
はポインタとして宣言された特別な変数であるとする.このとき,「p
はc
を指す」.
単項演算子*
をポインタ変数につける(例;*p
)と,そのポインタが指している変数自身にアセスできる.すなわち,*p
はc
と同値.<=重要!
ポインタ変数を宣言するときは,そのポインタが指す変数の型を明示する.
int *p; (int* p; と書いてもよい)
この式は,*p
という表現がintであることを明示している.このとき,ポインタp
はint型の変数を指す変数であり,その変数のアドレスを保持している.また後述するようにポインタ変数は,他の変数とは異なる振るまいをする.
int n = 10; int *ip ; ip = &n;
このとき,*ip
とn
は同じものであり,両者は置きかえ可能である.
printf("%p\n", ip); ポインタの値(変数nのアドレス)を表示 printf("%d\n", *ip); ポインタが参照する変数nの値を表示
C言語では,ポインタと配列は,お互いが裏表の強い関係がある.
int a[10]; int *pa; pa = &a[0];
ポインタpa
は,(配列a[10]
の先頭の要素である)a[0]
のアドレスを指す.
このとき,C言語では,pa+1
は,(配列a[10]
の次の要素である)a[1]
のアドレスを指す.C言語では,ポインタに値を足したとき,このように変化するようになっている.
このポインタと配列の裏表の関係を使って,配列の取り扱いを簡潔に書くことができる.
C言語では文字列は,最後にNULL文字(\0)が付加された文字の配列である.したがって,文字列とポインタの間にも強い関係がある.
char amessage[] = "now is the time"; 配列amessage[]の中に文字列が記憶されている char *pmessage[] = "now is the time"; ポインタ*pmessageは文字列の先頭のアドレスを指している.
/* 文字列sの長さを返す関数*/ int strlen(char *s) { int len = 0; /* len;文字列の長さ */ while (*s != "\0' ) { /* 文字列の終端になるまでループ */ len++; s++; /* ポインタsは次の文字を指す*/ } return len; }
以下は難しい話になるのでこの授業では省略.C言語の詳細は,
「プログラミング言語C」 カーニハン、リッチー著、石田晴久訳、共立出版.
参照.
ポインタを使わない「値呼び出し」で関数を呼び出しても,元の値は変わらない.ポインタを使う「参照呼出し」で関数を呼び出せば,元の値が変わる.ポインタはこのようなところでも使われる.
省略