突然ですが、C言語のポインタの話。
C言語のポインタは、一般的には、
■(1)可変領域を取るために使う
【やり方】
・宣言する
int *a;
struct my_str *p_str; /* 前でstruct my_str{ int x; int y;};等、中身があるはず */
MY_STR *p_str_2; /* typedef struct をしている */
・領域を確保する
a = (int *)malloc(sizeof(int) * 5);
p_str = (struct mystr*)malloc(sizeof(struct my_str));
p_str_2 = (MY_STR *)malloc(MY_STR);
→配列の場合はcallocもある(callocは初期化される)
p_str =(struct mystr*)calloc(200,sizeof(struct my_str));
・値を設定する
*a = 8;
a++;
*a = 10;
(構造体の場合)
p_str->x = 10; /* (*p_str).x=10;と同じ */
という方法や
a[0]= 8;
a[1]= 10;
という方法など
・いろいろ演算する
・領域を返す
free(a);
free(p_str);
free(p_str_2);
■(2)ポインタで関数に値を渡すため
【やり方】
abc(a,10,6);
→int b;と宣言したもののポインタ渡しはabc(&b,10,6)など
→アドレス番号が渡るだけなので、中身は渡らない→変わらない
ですが、もう1つ、Cならではの本来的な使い方があります。
■(3)アドレスを直接指定して、値を書き換える
→組み込みなどで、制御装置を直接操作したいときに使う
【使い方】
・アドレスを宣言する
#define PINSEL0 *((volatile unsigned int *)(0xE002C000))
/* 0xE002C000 というメモリの番地があり、そこと外部の装置が繋がっている */
/* volatileで最適化を抑制する。メモリアドレスを直接表現するとき必要なことも
http://proger.blog10.fc2.com/blog-entry-20.html 参照 */
・値を設定する
PINSEL3 &= ~(0x3<<4);
/* 11を<<で(4つ)シフトさせ、~で反転00し
AND(&)を取る→と必ず00になり、クリアされる */
PINSEL3 |= (0x3<<4);
/* 11を<<で(4つ)シフトさせ、ORを取る
→と必ず11になり、値が設定される */
・この値を外部のシステムがみて、ON,OFFにより、動作を変える
C言語のポインタは、一般的には、
■(1)可変領域を取るために使う
【やり方】
・宣言する
int *a;
struct my_str *p_str; /* 前でstruct my_str{ int x; int y;};等、中身があるはず */
MY_STR *p_str_2; /* typedef struct をしている */
・領域を確保する
a = (int *)malloc(sizeof(int) * 5);
p_str = (struct mystr*)malloc(sizeof(struct my_str));
p_str_2 = (MY_STR *)malloc(MY_STR);
→配列の場合はcallocもある(callocは初期化される)
p_str =(struct mystr*)calloc(200,sizeof(struct my_str));
・値を設定する
*a = 8;
a++;
*a = 10;
(構造体の場合)
p_str->x = 10; /* (*p_str).x=10;と同じ */
という方法や
a[0]= 8;
a[1]= 10;
という方法など
・いろいろ演算する
・領域を返す
free(a);
free(p_str);
free(p_str_2);
■(2)ポインタで関数に値を渡すため
【やり方】
abc(a,10,6);
→int b;と宣言したもののポインタ渡しはabc(&b,10,6)など
→アドレス番号が渡るだけなので、中身は渡らない→変わらない
ですが、もう1つ、Cならではの本来的な使い方があります。
■(3)アドレスを直接指定して、値を書き換える
→組み込みなどで、制御装置を直接操作したいときに使う
【使い方】
・アドレスを宣言する
#define PINSEL0 *((volatile unsigned int *)(0xE002C000))
/* 0xE002C000 というメモリの番地があり、そこと外部の装置が繋がっている */
/* volatileで最適化を抑制する。メモリアドレスを直接表現するとき必要なことも
http://proger.blog10.fc2.com/blog-entry-20.html 参照 */
・値を設定する
PINSEL3 &= ~(0x3<<4);
/* 11を<<で(4つ)シフトさせ、~で反転00し
AND(&)を取る→と必ず00になり、クリアされる */
PINSEL3 |= (0x3<<4);
/* 11を<<で(4つ)シフトさせ、ORを取る
→と必ず11になり、値が設定される */
・この値を外部のシステムがみて、ON,OFFにより、動作を変える