小言_互联网的博客

访问和打印不同程序对象的字节表示

332人阅读  评论(0)

这是计算机原理的内容,因为数组、函数和指针都没有学过,看起来很艰难,所以把花了很久弄清楚的语句含义记录下来,以便日后复习。
完整代码如下:

#include <stdio.h>

typedef unsigned char *byte_pointer;

void show_bytes(byte_pointer start, size_t len)
{
    size_t i;
    for(i=0;i<len;i++)
        printf("%.2x",start[i]);
    printf("\n");
}

void show_int(int x)
{
    show_bytes((byte_pointer)&x,sizeof(int));
}

void show_float(float x)
{
    show_bytes((byte_pointer)&x,sizeof(float));
}

void show_pointer(void *x)
{
    show_bytes((byte_pointer)&x,sizeof(void*));
}

void test_show_bytes(int val)
{
    int ival=val;
    float fval=(float)ival;
    int *pval=&ival;
    show_int(ival);
    show_float(fval);
    show_pointer(pval);
}

int main()
{
    test_show_bytes(12345);
    return 0;
}

分解:
一、将byte_pointer定义为指向“unsigned char”类型数据的指针。

typedef unsigned char *byte_pointer;

typedef 类型1 *类型2:将类型2定义为指向类型1的指针。
以下两种代码中x都为指向“unsigned char”类型数据的指针。
A、typedef unsigned char *byte_pointer;
byte_pointer x;
B、unsigned char *x;

二、定义函数 show_bytes。参数为指向unsigned char类型数据的指针(事实上是指向该程序对象的指针被强制类型转换的结果)和类型为“size_t”的变量(事实上是对象使用的字节数)。

void show_bytes(byte_pointer start, size_t len)
{
    size_t i;
    for(i=0;i<len;i++)
        printf("%.2x",start[i]);
    printf("\n");
}

“%.2x”似乎指的是一次性输出两个。
size_t为表示数据结构大小的首选数据类型。
start[i]是数组的表示方法,指的是数组的第i个元素。但是可以用数组表示方法来引用指针(反之亦可),指的是该指针指向的位置为起始的第i个位置处的字节。
如果指针的类型(即指针指向的对象的数据类型)占用n个字节,那么会n个字节n个字节地跳。这是为什么要强制转换成char的原因。

三、定义函数show_int,打印整型数据的字节表示。

void show_int(int x)
{
    show_bytes((byte_pointer)&x,sizeof(int));
}

&x是取地址操作,在c/c++中还有创建指针的功能,创建一个指向该地址的指针。
这个指针的类型是int,但是被强制转换成了byte_pointer类型,因此符合函数show_bytes的定义。
后面两个定义函数同理。

四、定义test_show_bytes函数,以整数为参数,将它强制类型转换成float和int *型(指向int的指针)后,分别打印它们的字节表示。

void test_show_bytes(int val)
{
    int ival=val;
    float fval=(float)ival;
    int *pval=&ival;
    show_int(ival);
    show_float(fval);
    show_pointer(pval);
}

五、main函数。

int main()
{
    test_show_bytes(12345);
    return 0;
}


转载:https://blog.csdn.net/Yinger_2000/article/details/101631388
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场