#include<stdio.h>
typedef unsigned char * char_point;
char_point int_cp(int i)
{
printf("i: %d\n", i);
printf("&i: %p\n", &i);
printf("(c_p)&i: %p\n", (char_point) &i);
char_point cp = (char_point) &i;
return cp;
}
char_point float_cp(float f)
{
printf("f: %f\n", f);
printf("&f: %p\n", &f);
printf("(c_p)&f: %p\n", (char_point) &f);
char_point cp = (char_point) &f;
return cp;
}
void endian(char_point cp, int size)
{
for (int i=0; i<size; i++)
{
printf("0x%x\n", cp[i]);
}
}
int main()
{
int i = 0x21893678;
float f = 913.45678f;
endian(int_cp(i), sizeof(i));
//endian((char_point) &i, sizeof(i));
printf("== == == === = ==== === = == = == \n");
//endian((char_point) &f, sizeof(f));
endian(float_cp(f), sizeof(f));
}
期望的输出是和注释代码的输出一致
输出结果:
注释的输出:
看一下这个,有点帮助的 http://blog.csdn.net/liuhuiyi/article/details/7526889
我把你的代码在我的机子上跑了一遍,
i: 562640504
&i: 0033FCF8
(c_p)&i: 0033FCF8
0xf8
0xfc
0x33
0x0
== == == === = ==== === = == = ==
f: 913.456787
&f: 0033FCF8
(c_p)&f: 0033FCF8
0xf8
0xfc
0x33
0x0
不知道你的结果怎么跑出来的
第一行 i: 是0x21893678的十进制的值
第二行 &i:变量i所在的地址
第三行 (c_p)&i: 整型 i 强转为 char型 ,但是仍指向i的地址,即地址没变
在C语言中 Char型占2个字节,即16位
程序中,cp[0]保存了i地址中的0xfd ,cp[1]保存了 0x7f
由于已经存了16位数据,所以后面的cp[2]和cp[3]赋值为0
你怎么这么糊涂,计算机里面,地址的指针都是一样大小的,32位系统,那不论你是什么类型的数据,这个数据的地址到时32位的。地址指针的长度是恒定的,不是说,浮点型就长,或者整形就短。并且,不管你把一个数据强制转换为什么数据,数据的首地址都是不会变的(以大端模式讨论),即指向这个数据的指针不变,因为当你在程序中定义这个变量的时候,就像系统申请了一段内存空间,知道这个变量的声明周期结束,它在内存中的位置是不会变的。
你在main里声明的i和f两个变量在main里面所分配的地址是不同的,但在这里endian(int_cp(i), sizeof(i));调用,int_cp(i)这个地方所给的地址是一定一样的
我已经要吐血了,你自己看看你的代码是怎么写的,
char_point int_cp(int i)
char_point float_cp(float f)
char_point cp = (char_point) &i;
return cp;
char_point cp = (char_point) &f;
return cp;
首先,你的函数时传值,至于为什么这两个形参传进来地址是一样的,你自己百度函数的入栈和出栈,还有编译器的优化。
第二,你说CP[I]的值为什么一样,你好好看看你写的代码,你把一个四字节的数强制转化为一个无符号的char * cp,然后你把这个CP
返回,在endian()中你从cp的开始往后访问,一共访问了四个字节。在你的函数入栈的时候,编译器发现你定义了两个四字节的变量,而且只用了
一次,i,f;第一次,i入栈,在栈底,假设地址为0Xabababab,当函数执行完了,i出栈了。但是又有一个函数,和上一次一样,也是带一个四字节的
参数,入栈的时候,编译器还是会分配上一次的堆栈给当前的函数用,那么F也是在栈底,地址理所当然是0xabababab。如果问,为什么两次的堆栈首地址
相同,那么你要去问当初编写编译器的的工程师。还有你程序的开头有个重定义,char_point 是无符号的字符指针。
我不清楚其他人是怎么理解的,我个人理解你这个程序倒是没有错误,我说一下个人看法,不知道你能不能看懂
endian(int_cp(i), sizeof(i));
endian(float_cp(f), sizeof(f));
这两个经过函数调用,多加了一次指针指向,传入到endian的参数实际上变成指针的指针,多加了一层指针指向,
所以这个函数调用打印的值是局部变量f或者i的地址
//endian((char_point) &i, sizeof(i));
//endian((char_point) &f, sizeof(f));
这个地方调用,传入的是i和f的地址,cp指针取值的的时候打印的就是i和f的对应值
如果不对 希望大神批评指点