ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

C言語のポインタは、アドレスの値が入ってるを実感できる、組み込み的な使い方

2015-11-18 10:57:52 | トピックス
突然ですが、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により、動作を変える
この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 「WEBサイトが改ざんされた…... | トップ | Sparkは来るのか来ないのか、... »
最新の画像もっと見る

トピックス」カテゴリの最新記事