用C语言打印出一个字节的值及其地址

用C语言打印出一个字节的值及其地址,c,pointers,C,Pointers,我现在正在研究指针,我试图了解内存中的东西是如何显示的,所以我正在尝试构建这个程序。它的目标是获取一个整数,在内存中打印它的地址,然后在每个字节打印它的整数值。所以对于一个整数,4对(地址,值)。然而,我的工作结果相当混乱,因为我得到了像这样奇怪的结果。如果有人能解释我做错了什么,我将不胜感激。从上下文来看,我从一门课上了解了一点关于计算机体系结构和内存的知识 输入一个整数:287 0x7ffd455a7474 31 0x7ffd455a7475 1 0x7ffd455a7476 0 0x7ff

我现在正在研究指针,我试图了解内存中的东西是如何显示的,所以我正在尝试构建这个程序。它的目标是获取一个整数,在内存中打印它的地址,然后在每个字节打印它的整数值。所以对于一个整数,4对(地址,值)。然而,我的工作结果相当混乱,因为我得到了像这样奇怪的结果。如果有人能解释我做错了什么,我将不胜感激。从上下文来看,我从一门课上了解了一点关于计算机体系结构和内存的知识

输入一个整数:287

0x7ffd455a7474 31

0x7ffd455a7475 1

0x7ffd455a7476 0

0x7ffd455a7477 0

#include <stdio.h>

void byte_value(int *);
int main(){

    int n =1;
    printf("Enter an integer: ");

    if (scanf("%d", &n) == 1)

        byte_value(&n);

    

    return 0;  

}

void byte_value(int *p) {
    char *p2=((char *)p);
    char *max=p2+sizeof(int);
    for(;p2<max;p2++){
            printf("%p %u\n",p2,*p2);
    }

    return;

}
#包括
无效字节_值(int*);
int main(){
int n=1;
printf(“输入一个整数:”);
如果(扫描频率(“%d”,&n)==1)
字节值(&n);
返回0;
}
无效字节_值(int*p){
char*p2=((char*)p);
char*max=p2+sizeof(int);

对于(;p2我认为这个版本可能会解释得更多一些。(十六进制值非常方便)


287=256*1+31。输出没有问题。也许您想知道更多关于大于一个字节的值是如何存储在内存中的。我看不出这个程序有什么特别奇怪或错误的地方,除了可能将
%u
与纯
字符
一起使用。您希望得到什么输出?除了不强制转换
p2
参数到
printf
作为
(void*)p2
(这只是一个“小”错误,不会影响99%的情况),您没有做错任何事。您不明白的是什么?@AdrianMole这甚至不是一个错误,因为
char*
void*
保证具有相同的表示形式。我本来希望打印二进制表示形式。不鼓励回答代码,至少您应该解释代码的作用@M.M.在哪里----
void byte_value(void *, size_t);
int main(void)
{

    int n =1;
    printf("Enter an integer: ");

    if (scanf("%d", &n) == 1)
        printf("\n------------\nentered: %d (0x%x)\n", n, (unsigned)n);
        
        byte_value(&n, sizeof(n));
}

void byte_value(void *ptr, size_t size) 
{
    unsigned char *p = ptr;
    while(size--)
    {
        printf("%p - %03u (0x%02x)\n", (void *)p, *p, *p);
        p++;
    }
}