关于SHOW_BYTES的学习经验
以下内容主要是我对这篇代码的学习经验与总结,对各个地方都会有详细的批注解释。文章可能存在一些纰漏,欢迎大家指正!
阅读顺序提示:
1.按照main函数的顺序对代码依次进行解释,并附有相应运行结果
2.完整的代码
一:关于输入新数据代码解释
typedef unsigned char *byte_pointer;
① typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
②在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。int main(int argc, char *argv[])
①我们通常说main函数不能带参数,实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数。C语言规定main函数的参数只能有两个, 习惯上这两个参数写为argc和argv。
②argc参数表示了命令行中参数的个数(注意:文件名本身也算一个参数)argc的值是在输入命令行时由系统按实际参数的个数自动赋予的。
③argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。 指针数组的长度即为参数个数。数组元素初值由系统自动赋予。
int main(int argc, char *argv[])
{
int val = 12345;
if (argc > 1) {
val = strtol(argv[1], NULL, 0);
printf("calling test_show_bytes\n");
test_show_bytes(val);
} else
-
if (argc > 1)
“2”中提到过“argc”表示命令行中参数的个数,而文件名本身也算一个参数,不带参数时argc=1,所以判断是否输入新参数的条件为(argc>1)
此处的if/else语句用来判断程序是否输入新的数据 -
val = strtol(argv[1], NULL, 0); printf("calling test_show_bytes\n");
如果输入新数据,新数据的值存储在argv[1]中
strtol函数会将参数nptr字符串根据参数base来转换成长整型数,参数base范围从2至36或0
strtol(const char *nptr,char **endptr,int base); -
show_bytes
这个函数用于传递无符号字符型指针及所指对象的字节数
并依次输出每个字节的存储地址和值
%p:输出地址
%.2x:宽度为二,右对齐方式,位数不够左边补零。X表示输出十六进制数。
star[i]表示从star[0]开始第i个位置的字节 -
show_int/float/pointer
这三个函数将不同类型对象的指针都强制转换成unsigned char*
类型,并用sizeof
表示该对象所占字节数
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