ポインタ;他の変数のアドレスを内容とする変数.
単項演算子&は,その変数のアドレスを与える(アンドだからアンドレスと覚える).
したがって,
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」 カーニハン、リッチー著、石田晴久訳、共立出版.
参照.
ポインタを使わない「値呼び出し」で関数を呼び出しても,元の値は変わらない.ポインタを使う「参照呼出し」で関数を呼び出せば,元の値が変わる.ポインタはこのようなところでも使われる.
省略