c语言 如何把参数十六进制地址完整存入char数组

inti;long*pt=&i;chararray[4];如何把pt的值完整存入array中去?... int i; long *pt=&i; char array[4];
如何把pt的值完整存入array中去?
展开
 我来答
吉祥二进制
高粉答主

2015-05-23 · 科技改变生活,生活改变科技。
吉祥二进制
采纳数:33926 获赞数:84577

向TA提问 私信TA
展开全部

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++;}}
不对啊
追答

不好意思漏打了一个&

#include <stdio.h>

int main()
{
        int i = 0;
        int *p = &i;
        char* tmp = (char*)&p;
        char arr[5] = {0};
        for(int j = 3; j >= 0 ; --j)
        {
                *(arr+j) = *tmp++;
        }
        printf("%p\n", p);
        printf("%p\n", *((int*)arr));
        return 0;
}

测试结果为

输出正常

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式