关于强制类型转换以及将整数转换为指针的有关问题

关于强制类型转换以及将整数转换为指针的问题
最近看c陷阱与缺陷,里面有节是“空指针并非空字符串”,由此提出问题。

#include <stdio.h>
void   main()
{
int   temp=97,*q,temp1=97;
char   *p,c= 'b ';        

printf( "%c\n ",(char   *)temp);//这两句是等价的吗?
printf( "%c\n ",(char)temp);//(char   *)temp强制转换temp为指向字符的指针,那这指针在哪,又没有声明

//问题:使用强制类型转换符时,若类型提升,则碰到以下情况,机内是怎么实现的,
//是不是将(double)num[1]另外分配在一个空间上,或是映射
//
{
int   num[3]={1,2,3};
printf( "\n%lf\n ",(double)num[1]);
}

//以下有没问题?
q=&temp;

//以下warning   C4047:   '== '   :   'int   * '   differs   in   levels   of   indirection   from   'int   **   '
if(q==&((int   *)temp))
puts( "1ok ");
else
puts( "1error ");
//以下warning   C4047:   '== '   :   'int   '   differs   in   levels   of   indirection   from   'int   * '
if(*q==(int   *)temp)
puts( "2ok ");
else
puts( "2error ");
//以下warning   C4047:   '= '   :   'char   * '   differs   in   levels   of   indirection   from   'int   **   '
p=&((int   *)temp);
printf( "%d\n ",*p);
//上下两句能说是等价吗
//以下warning   C4047:   '= '   :   'char   * '   differs   in   levels   of   indirection   from   'char   **   '
p=&((char   *)temp);
printf( "%d\n ",*p);

}
//调试 The   thread   0xE3C   has   exited   with   code   3   (0x3).


//以上我说的对吗???各位大虾,请帮帮忙,我比较菜。


//最后弱弱地问,将一个整数转化为指针有什么用呢,举个例子吧。

------解决方案--------------------
lz,你还一口气问了不少问题啊。。。

问题1:
printf( "%c\n ",(char *)temp);
printf( "%c\n ",(char)temp);
//这两句是等价的吗?
------------------------------------------------------
printf( "%c\n ",(char *)temp);是把temp变量的内容解释为地址压栈(4字节)
printf( "%c\n ",(char)temp);实际上把char类型的temp整形提升到int压栈,也是4字节
所以压栈的内容是一样的,所以输出相同


//(char *)temp强制转换temp为指向字符的指针,那这指针在哪,又没有声明
-------------------------------------
这个指针并不需要额外的存储,编译器将直接处理,例如,在VC下,反汇编得到的结果就是:

10: printf( "%c\n ",(char *)temp);
0040104A 8B 45 FC mov eax,dword ptr [ebp-4]
0040104D 50 push eax


问题2:
//问题:使用强制类型转换符时,若类型提升,则碰到以下情况,机内是怎么实现的,
//是不是将(double)num[1]另外分配在一个空间上,或是映射
//
{
int num[3]={1,2,3};
printf( "\n%lf\n ",(double)num[1]);
}
-----------------------------
同样的,这是由编译器帮你处理的,不需要额外的存储,只是一个临时量
例如,在VC下反汇编的结果是:

18: printf( "\n%lf\n ",(double)num[1]);
00401082 DB 45 E4 fild dword ptr [ebp-1Ch]
00401085 83 EC 08 sub esp,8
00401088 DD 1C 24 fstp qword ptr [esp]
0040108B 68 38 40 42 00 push offset string "\n%lf\n " (00424038)
00401090 E8 5B 02 00 00 call printf (004012f0)

fild和fstp是浮点处理指令


问题3:
if(q==&((int *)temp))
类似这样的强制类型转换在VC下可以编译,但在mingw下会报错。。。

我不清楚ANSI C标准是怎样说明的,不明白为什么&((int *)temp))这样的表达式在VC下不会报错,而&((double)temp)则会报错。照理说,这两者的地位是等价的。都是一个临时量,无法充当左值,也就无法运用&操作符。