すぐにこんがらがるのでメモ
ポインタとは、(変数の)メモリ上のアドレスの番地を格納するための仕組み

//ポインタの定義
//型名 *変数名
int *p;
int* p;//*の位置はこの書き方でもよい

int a=100;
//変数aのメモリ上のアドレスは、&aとなる。
//ポインタpにaを参照させるには、
p = &a;//*pではないことに注意
//ポインタからaの値を取得するには
int b=*p;
printf(b);//出力:100

*の使い方についての注意
定義するときの*と、それ以外の*では意味合いが異なるらしい

//整数定義
int a = 100;
//整数型のポイントを定義
int *p;
*p = a;//これはNG
//定義後のポインタ変数に参照させるには、p = &a;
//ただしポインタ定義時の初期化でaを代入するのはOK
int *q = a;//これはOK
//定義するときの*と、それ以外の*では意味合いが違うということらしい

配列のときは配列名には、&はつける必要がない
ポインタ名は配列と同じようだ。

int a[20] = {1,12,23,34,45};
int b = 100;
int *pa;
int *pb;
pa = a;//&aにはならない
pb = &b;

//配列aの2番目の値を取得するには
//配列aを使う場合
printf("%d\n",a[1]);//出力:12
//ポインタpaを使う場合
printf("%d\n",*(pa+1));//出力:12
printf("%d\n",pa[1]);//出力:12

メモリを確保したポインタも配列と同じように扱える

int *bufa;
//100バイト分のメモリを確保
bufa = (int *)malloc(sizeof(int)*100);
bufa[10] = 123;
//配列のように参照
printf("%d\n",bufa[10]);//出力:123
//ポインタとして参照
printf("%d\n",*(bufa+10));//出力:123