ポインタの基礎

  • C言語ではポインタというものが出てくる
  • まずはポインタの基礎の整理
    • ポインタpはメモリの場所を示すものらしい
    • pに変数yのアドレス&yを代入できる
    • *pはアドレスp (&y) に納められている数 (y) ということになるのだろうか
  • y,&y,*p,p を書き出してみる
    • &y と p はアドレス
    • y と *p は納められている値
    • となっている
#include <stdio.h>

int main(void)
{
int y;
int *p;
p = &y;
*p = 9;
printf("(y, &y, *p, p) is (%d, %d, %d, %d)\n",y,&y,*p,p);
return 0;
}
  • 実行
(y, &y, *p, p) is (9, -1073743144, 9, -1073743144)
  • また配列について
    • 配列a[]とポインタp について
    • a と p と &a[0] が同じ
    • &a[i] と p+i が同じ
  • ということで
    • *(p + 2) と a[2] は同じになる
int main(void)
{
int a[10];
int i;
int *p;
p = a;
printf("(a, p) is (%d, %d)\n",a,p );
	for(i=0;i<10;i++){
	printf("(p + %d, &a[%d]) is (%d, %d) \n",i,i,p+i,&a[i]);
	}	
}
  • 実行
(a, p) is (-1073743184, -1073743184)
(p + 0, &a[0]) is (-1073743184, -1073743184) 
(p + 1, &a[1]) is (-1073743180, -1073743180) 
(p + 2, &a[2]) is (-1073743176, -1073743176) 
(p + 3, &a[3]) is (-1073743172, -1073743172) 
(p + 4, &a[4]) is (-1073743168, -1073743168) 
(p + 5, &a[5]) is (-1073743164, -1073743164) 
(p + 6, &a[6]) is (-1073743160, -1073743160) 
(p + 7, &a[7]) is (-1073743156, -1073743156) 
(p + 8, &a[8]) is (-1073743152, -1073743152) 
(p + 9, &a[9]) is (-1073743148, -1073743148) 
  • 実は
  • ポインタを使えば2つの配列をベクトルの足し算のように計算できるのかなと思ったが、*p や *a は結局 a[0]のことになるので a[0] ... a[9] をまとめて扱うことにはならなかった
    • 別の方法を用いるのだろう...
    • それから文字列(配列)ではまたポインタの扱いがちがうみたいだ