STEP 6 - アドレスとポインタ │ ├ アドレスとポインタ ├ sizeof演算子 ├ ポインタ │ ├ アドレス演算子 │ └ ポインタ変数 ├ ポインタの演算 ├ 配列とポインタ └ ポインタ配列 |
Written by Yuki. http://ftc.suki.net/ |
<アドレスとポインタ> アドレス 郵便で例えるなら、送り先の住所。 メモリ 何かしまう為の箱。それがいくつも連続していて、箱ごとの固有の番号がアドレスになる。 ポインタ 箱の番号(アドレス)を指定するもの。変数のアドレス。 実際には、変数を宣言するとメモリ上に変数の番号が決まる。変数のサイズ分の箱を確保する。 箱は一つ 1バイトである。例えば int型なら 4バイトで、その分だけメモリを占有する。 ※今までのアドレスの使用例 (1)scanf("%d",&a); ' (&)アドレス演算子。変数aのアドレスを指定する。 (2)char s[10]; printf("%c\n",s); ' 配列名のみを引数に与える。 (3)gets(s); puts(s); ' 配列の先頭アドレスを指定する。 ※変数は何故か最後に宣言したものから、順にアドレスを割り当てられる。 但し、Windows上のVC++においては必ずしもそうではない。 尚、自分でアドレスを指定することはできない。 ※コンピュータのアドレスは基本的に偶数から始まる。 奇数から始まるものはアドレスエラーの状態になる。
<sizeof演算子> sizeofはビルド時に、この演算子を付けた「式」のバイト長を返す。 sizeof(式); ※括弧を外した記述も可能だが、この場合、型指定子の指定はできない。 sizeof(i); ' 場合によっては括弧の有無で戻り値が異なる場合がある。 sizeof i; 括弧内での sizeof演算子の計算(インクリメント等)は行われない。
<ポインタ> (1)アドレス演算子 &(アンパサンド)の後ろに続く変数のアドレスを返す。 printf("%d\n",&i); ' 変数iのアドレスを表示。 ' ポインタが指す変数と型が一致していなければならない。 (2)ポインタ変数 → サンプルプログラム *(アスタリスク:ポインタ演算子)の後ろに続くアドレスに格納されている値を返す。 int i=10,*p; ' 変数iとポインタ変数pを宣言。 p=&i; ' ポインタ変数pに変数iのアドレスを格納。 printf("%d\n",*p); ' ↑により変数iのアドレスを参照し、iの値を表示する。 変数の前にアスタリスクを付ける事により、コンピュータにポインタ変数を作成した事を知らせる。 型指定子は、ポインタが指す変数の型を指定する。これを基底型という。 ※アスタリスクは宣言時にはポインタ演算子である事を表す。 プリント時にはその後ろの変数の値を表すものになる。
<ポインタの演算> 以下がポインタで使用できる演算子。 & アドレス演算子 * ポインタ演算子 + 加算 ' 加算減算は整数型でのみ可能。 - 減算 ++ インクリメント -- デクリメント ポインタ演算では、加算減算によるアドレスの変化量が基底型により異なる。 ポインタを 1変化させると、アドレスを基底型のサイズ分変化させる。
<配列とポインタ> C言語では関数の引数に配列を指定する時は、ポインタを引数として用いる。 int a[]={0,1,2,3,4}; int *p=a; ' 配列aの先頭アドレスをポインタpへ記憶させる。 printf("%d %d %d\n",*p,*(p+1),*(p+2)); ' アドレスの内容を示す。 printf("%d %d %d\n",a[0],a[1],a[2]);
<ポインタ配列> ポインタ配列は、文字列の配列(文字列テーブル)使用時に用いる事が多い。 型指定子 *配列名[要素数]; char str[4][7]={"apple","orange","lemon","banana"}; ↓ char *str[4] ={"apple","orange","lemon","banana"}; ' 初期化子の文字列に影響を受けない。
← ← Back to BeforeStep | Go to NextStep → → |