【プログラミング】アドレスとポインタについて【覚書】

20160504221036

アドレスとポインタの関係で凡人らしく一通り悩み、取っ掛かりの部分がなんとなくわかったような気がしないでもないので自分用の覚書。

完全に入門者以下の認識なので、間違っている可能性も多々……。(+д+)マズー

アドレスとポインタの表記

  • アドレスは『&』を変数の前につけてやることで取得できる。(&aなどと表記)
  • ポインタは『 * 』は変数の前や型の後につける。(*p、int*などと表記)※

 

※ 変数のポインタと型のポインタの違いが今ひとつ……。

 

アドレスはメモリの番地であって、取得できるのはメモリに保存されている値ではない。

アドレスを取得してやり、ポインタに放り込んでやる(ラベル貼り?)ことで、そのポインタを経由して直接、アドレスに保存されている値をやり取りできる。

また、そうすることで処理の高速化が望める(読み書きのロスが減る)。また、デバイスなどは直接、メモリとやり取りするので、このアドレスとポインタが必要になってくる。

変数を定義して代入した値を物とすると……

  • アドレスは変数を定義したときにメモリ上に割り振られる番地(物の置き場所)。
  • ポインタはアドレス(番地のシール)を貼り付けることのできる空のダンボール
  • ポインタに値(物)を代入する(番地のシールを貼る)と、指定されたアドレスにダンボールが配達されて物(値)が既存のものと置き換わる(上書きされる)。

 

※ なんとなくわかったような気がする程度の理解なので、果たして適した表現なのかは微妙なところ……。

ポインタ変数モードと通常変数モードの切り替え

int main(void){
int a = 100;
int* b;   ←←← ポインタ変数として宣言。※
b = &a;   ←←← ポインタ変数 b に変数 a のアドレスを代入。
*b = 20;  ←←← 変数 a のアドレスを持つ変数 b に20という定数を代入。
printf(“aの中身は%dになる”,a);
return 0;
}

→→→ 『aの中身は20になる』と出力される。

 

  1. ポインタ変数として、メモリのアドレスを代入。
  2. 通常の変数に切り替えて、1で代入したアドレスのメモリ(に保存されている値)を直接操作。

 

※ ポインタ変数にアドレスを代入したか確認するためにヌルポインタを使用する。ポインタ変数宣言時にNULLという記号をポインタ変数に代入しておくと、使用不可のアドレスを使わずに済む。

(例) int *b = NULL;

配列とポインタ

配列とポインタは同種のもの……? 

配列の要素を扱うときは配列名[添字]で表記。配列名に添字をつけずに使用すると、配列の先頭要素である配列名[0]を指すポインタ、&配列名[0]になる。

 

int main(void){
int array[10];
int *p;
int i;

p = array;  ←←← p = &array[0]と同じ意味。ダンボールに番地が貼られる。※
for ( i = 0; i < 10; i++ ){
p[i] = i;   ←←← array[i] = i と同じ意味。ダンボールに物が入り、配達される。
printf(“%d”,array[i]);
}

return 0;
}

→→→ 0 1 2 3 4 5 6 7 8 9

 

※ p = &array[2];として、forの中身の処理を*(p+i) = i;とすると、array[i+2]=iと同じ意味になる。

ポインタについて

 

( -人-).。oO(・・・・・・先は長そう)

処理を軽くしようと思ったらアドレスとポインタを使いこなすのは必須っぽいなぁ……。

関連記事
スポンサーサイト

0 Comments

Post a comment