STEP 6 - アドレスとポインタ
 │
 ├ アドレスとポインタsizeof演算子ポインタ
 │ ├ アドレス演算子
 │ └ ポインタ変数ポインタの演算配列とポインタポインタ配列

猿でも解る C言語講座

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 → →