一回生に送る配列とポインタの違い

これわかったら楽しくなってくると思う

これわかったら楽しくなってくると思う

  • タグ:
  • タグはありません
#include "stdio.h"

main(){
  //配列はポインタなんだよというデモ
  //配列でメモリを異常に弄って4バイトのintの中身をcharを使って1バイトずつ書き換えます。
  unsigned int i[2]={0}; //符号なしint
  unsigned char go_i[1];

  //i[0]
  go_i[1] = 15; //i[0]
  go_i[2] = 14; //i[0.25]←実際にはできない表現
  go_i[3] = 13; //i[0.5]
  go_i[4] = 12; //i[0.75]

  //i[1]
  go_i[5] = 11; //i[1]
  go_i[6] = 10; //i[1.25]
  go_i[7] = 9;  //i[1.50]
  go_i[8] = 8;  //i[1.75]
  printf("%x %x\n",i[0], i[1]); //16進数で表示

  i[0] = 0;i[1] = 0;


  //同じ事をポインタでやる
  ////////////////////////////
  char *i_head = (char *)&i; //そのままでもiのアドレスをcharのポインタに入れられるが
  //こうすると分かっててやってることが明示できるのでwarningが出なくなる。

  //i[0]
  *(i_head) = 15;
  *(i_head+1) = 14;
  *(i_head+2) = 13;
  *(i_head+3) = 12;

  //i[1]
  *(i_head+4) = 11;
  *(i_head+5) = 10;
  *(i_head+6) = 9;
  *(i_head+7) = 8;
  printf("%x %x\n",i[0], i[1]);

  i[0] = 0;i[1] = 0;


  //もちろんint型のポインタを使えば普通の配列のように使える
  /////////////////////////////////////////////////
  int *i_p = (unsigned int *)&i;

  *i_p = 0xc0d0e0f; //16進数の代入 i[0] = 202182159 と等価
  *(i_p+1) = 0x8090a0b; //i[1] = 134810123
  printf("%x %x\n",i[0], i[1]);
}