苦思冥想,关于【指针类型强制转换】的有关问题!求解

苦思冥想,关于【指针类型强制转换】的问题!求解!
先看代码:
  unsigned char arr[2] = {0xffff0101,0x00000001};  
   
  printf("%d\n", *((char *)&(arr[0])));
  printf("%d\n", *((int *)&(arr[0])));
   
  运行结果:
  1
  257

  上文我能理解,知道指针类型决定了 *(指针)的值得取值范围。但是下文,我就不理解了。
  unsigned int a = 0xfffffff7;
   
  printf("%x\n", a);
  printf("%x\n", *((char *)&a));
  运行结果:
  0xfffffff7
  0xfffffff7
-----------------------------------
  我不明白指针的类型是什么意思,我明白指针其实就是一个32位的整数,以前这么认为
  比如:unsigned char *p 的值是0x00000004,所以 *p的值就是0x00000004的【值也也就是这个地址的8位二进制的和】;
  比如:unsigned int *p的值是0x00000004,所以 *p的值就是0x00000004【开始的4个字节的二进制的和】;

  而我发现,许多书上写的是,指针类型的转换只是影响的指针的寻址,不影响指针值,我迷惑了!希望有人来回答!

  到底指针类型表示着什么?