c语言整型变为字符指针,关于强制类型转换以及将整数转换为指针的有关问题...

当前位置:我的异常网» 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)则会报错。照理说,这两者的地位是等价的。都是一个临时量,无法充当左值,也就无法运用&操作符。

文章评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值