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