CSAPP SHOW_BYTES代码简析

关于SHOW_BYTES的学习经验

以下内容主要是我对这篇代码的学习经验与总结,对各个地方都会有详细的批注解释。文章可能存在一些纰漏,欢迎大家指正!

阅读顺序提示:
1.按照main函数的顺序对代码依次进行解释,并附有相应运行结果
2.完整的代码

一:关于输入新数据代码解释

  1. typedef unsigned char *byte_pointer;
    ① typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
    ②在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
  2. 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 
  1. if (argc > 1)
    “2”中提到过“argc”表示命令行中参数的个数,而文件名本身也算一个参数,不带参数时argc=1,所以判断是否输入新参数的条件为(argc>1)
    此处的if/else语句用来判断程序是否输入新的数据

  2. 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);

  3. show_bytes
    这个函数用于传递无符号字符型指针及所指对象的字节数
    并依次输出每个字节的存储地址和值
    %p:输出地址
    %.2x:宽度为二,右对齐方式,位数不够左边补零。X表示输出十六进制数。
    star[i]表示从star[0]开始第i个位置的字节

  4. 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 
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值