处女贴!新手自学C遇到一点难题!请!

处女贴!新手自学C遇到一点难题!请高手指点!!
只有非常量数据的地址才可以付给普通的指针:
  double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
const double locked[4] = {0.08, 0.075, 0.0725, 0.07};
double *pnc = rates; //合法
pnc = locked; //非法
pnc = &rates[3]; //合法 
这样的规矩是合理的。否则,你就可以使用指针来修改被认为是常量的数据
这是c primer plus书上266页的
以下是我自己加的
  2 #include <stdio.h>
  3
  4 int main(void)
5 {
- 6 double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
- 7 const double locked[4] = {0.08, 0.075, 0.0725, 0.07};
  8
  9
- 10 double *pnc = rates; //合法
- 11 printf("*pnc = %d\n", *pnc);
  12  
- 13 pnc = locked; //不合法
- 14 printf("*pnc = %d\n", *pnc);
  15
- 16 pnc = &rates[3]; //合法
- 17 printf("*pnc = %d\n", *pnc);
  18
- 19 return 0;
  20
- 21 }
以下是程序最终输出的结果
*pnc = 687194767 *pnc = 1202590843 *pnc = 51536076
 1.我的问题是
printf("*pnc = %d\n", *pnc); 这句应该是输出*pnc = 88.99为什么结果却是*pnc = 687194767 ?
而我在调试的时候里面的至确实是88.99 这是调试的数据 pnc = (double *) 0x22ff10 *pnc = (double) 88.9999999999995

2.第二歌就给我解释下下面这句书上我看不明白
13 pnc = locked; //不合法  

希望有经验的给破个处!!

------解决方案--------------------
printf和scanf严格按你输入的字符串来处理参数
你给它的字符串里是%d,它就认为你给它的是一个整型变量,具体它会执行哪些操作我不清楚,但可以肯定它绝不会输出一个浮点数

double*是一个指向double型变量的指针,locked是一个double常量数组,后者不能转化为前者,有啥看不懂的?
------解决方案--------------------
1. %d 改为%lf
2. locked为常量指针,表明里面的内容不可修改,如果pnc=locked合法
利用pnc就可以修改locked里面的内容了。