难理解的c代码(1)
来源:互联网 发布:乱世佳人电影结局知乎 编辑:程序博客网 时间:2024/06/07 00:18
#include <stdio.h>int main(){union{int ig[4];char a[8];}t;t.ig[0] = 0x4241;t.ig[1] = 0x4443;t.ig[2] = 0x4645;t.ig[3] = 0x0000;printf("\n%s\n", t.a);return 0;}
先看结果:
到这里,还很蒙。
试试下面程序:
#include <stdio.h>int main(){union{int ig[4];char a[8];}t;t.ig[0] = 0x4241;t.ig[1] = 0x4443;t.ig[2] = 0x4645;t.ig[3] = 0x0000;//printf("\n%s\n", t.a);printf("%d\n",sizeof(t));return 0;}结果:
可以看到,union长度为16,则可以推知:union中的int是4字节,char是一字节(这个是学c的都知道的)
试试下面程序:
#include <stdio.h>int main(){union{int ig[4];char a[8];}t;t.ig[0] = 0x4241;//t.ig[1] = 0x4443;//t.ig[2] = 0x4645;//t.ig[3] = 0x0000;printf("\n%s\n", t.a);//printf("%d\n",sizeof(t));return 0;}
结果:
可以看到,结果为AB,因为0x4241中,41是存储在低位的,也就是ig数组的头部地址,这样先输出0x41(A),再输出0x42(B)
但是把 t.ig[1] = 0x4443的注释去掉后,发现结果仍是AB,why?后来才想到,每一个元素是32位,而0x4241才占用了16位,后面16位是空的,这样当读到后8位的时候,因为无内容,则停止读取,所有后面即使为ig数组中的其他元素赋值,也不会输出了。
可以用下面的程序做尝试:
#include <stdio.h>int main(){union{int ig[4];char a[8];}t;t.ig[0] = 0x44434241;t.ig[1] = 0x4443;//t.ig[2] = 0x4645;//t.ig[3] = 0x0000;printf("\n%s\n", t.a);//printf("%d\n",sizeof(t));return 0;}
结果:
可以看到补齐ig[0]的后16位后,结果为ABCDCD,这时候就明白了。
阅读全文
0 0
- 难理解的c代码(1)
- 怎么快速的理解C代码
- KMP算法的理解,伪代码,c代码实现
- 理解C语言指针和数组的关系的代码
- 光流法的介绍(含C++代码)_醉翁【图像理解】_百度空间
- c语言,通过代码对指针的理解
- 1、通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的(原创)
- 理解 JavaScript 的 this 关键字(代码)
- 代码段的理解
- 代码覆盖率的理解
- C语言学习总结(1)-递归函数的理解
- 从本质理解C指针的应用(1)
- C语言很难理解的表达式
- C#—代码理解知识点(一)
- C#—代码理解知识点(二)
- Linux 0.12 sched.c代码理解
- ##一段C代码理解cdel调用
- hibernate 数据操作流程
- 多线程之GCD详解
- 浏览器访问网页全过程
- java运算符
- Linux下解决Qt连接MySql找不到驱动的问题
- 难理解的c代码(1)
- arraycopy方法和二维数组
- Fiddler--下载安装、原理、教程
- 自定义view group
- Java基础知识总结(绝对经典)
- [题解]hdu5634 Rikka with Phi
- 【经验随笔】Restlet Client发送XML格式参数消息
- i2c 相关知识总结
- CentOS6.4 配置iptables