当前位置:我的异常网» C语言 » 关于强制类型转换以及将整数转换为指针的有关问题
关于强制类型转换以及将整数转换为指针的有关问题
www.myexceptions.net 网友分享于:2013-02-29 浏览:89次
关于强制类型转换以及将整数转换为指针的问题
最近看c陷阱与缺陷,里面有节是“空指针并非空字符串”,由此提出问题。
#include
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)则会报错。照理说,这两者的地位是等价的。都是一个临时量,无法充当左值,也就无法运用&操作符。
文章评论