c语言 如何把参数十六进制地址完整存入char数组
inti;long*pt=&i;chararray[4];如何把pt的值完整存入array中去?...
int i; long *pt=&i; char array[4];
如何把pt的值完整存入array中去? 展开
如何把pt的值完整存入array中去? 展开
2个回答
展开全部
1、在C语言中变量的地址实际上是一个unsigned的类型。因此常规操作使用unsigned变量来存储,比如下面的代码:
#include <stdio.h>
int main()
{
int a = 2;
unsigned a_addr 氏羡= (unsigned) (&a);
printf("%x\n", a_addr);
return 0;
}
2、如果使用char数组来保存地址,可以使用union联合体来间接实现。示例代码如下:
#include <stdio.h>
union ix{
int *p;
unsigned char x[4];
}uix;
int main()
{
int a = 2;
uix.p = &a;
for (int inx=3; inx>=0; --inx) {
printf("%x\t", uix.x[inx]);
}
printf("\n");
return 0;
}
3、看2中的示例代码,有朋友要问为什么要inx=3开始循环呢?这是因为存储顺序的原因,个人使用的电脑是intel的cpu,是little endian(小端机)的存储方式。如果说要”霸王硬上弓”的强取unsgined char来保存地址,则必须考虑当前使用的计算机是小端机还是大端机。示例代码。
#include <stdio.h>
//判断大端机还是小端机
//小端歼轮拍机返回字符L,大端机返回字符B
char endian()
{
unsigned ui = ~0 - 1;
return ((*(unsigned char *)&ui==0xfe) ? 'L' : 'B');
}
int main()
{
int a = 2;
//输出变量a的地址,用于对比
printf("a变量的内存地址:%x\n", &a);
unsigned char x[4] = {0};
int little_loop = 0, inx;
int *op = &a;
if (endian()=='L') {
for (inx=3; inx>=0; --inx, ++little_loop)
x[little_loop] = *((unsigned char *)&op + inx);
}else{
/* 大端机的直接复制即可*/
for (inx=0; inx!=4; ++inx)
x[inx] = *((unsigned char *)&op + inx);
}
printf("字符数组中的地址值:");
for (inx=0; 桐拆inx!=4; ++inx) printf("%x\t", x[inx]);
printf("\n");
return 0;
}
程序执行效果:
2014-09-14
展开全部
这个要区分机器字节序,也就是大小端
对于大端机
char *tmp = (char*)pt;
for(int i = 0; i < 4; ++i)
胡戚 迟稿 *(arr+i) = *tmp++;
对于小段机
char *tmp = (char*)pt;
for(int i = 3; i 裤旦陵>= 0; --i)
*(arr+i) = *tmp++;
更多追问追答
追问
#includevoid main(){long aaa; char array[4];long *pt=&aa; char *temp=(char *)pt; int i;for(i=0;i<4;i++){*(array+i)=*temp++;}i=0;while(i<4{printf("array[%d]=%x\n",i,array[i]);i++;}}
不对啊
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询