C中有关内存操作的一些Tip
2011-04-05 10:18
288 查看
假设一个数组a,数组元素都是int,数组共有3个元素,那么
a+1整个表达式就等于a[1]
此时如果假设在系统中,一个int使用2个Byte来存储,那么a+1这个表达式其实是将
a的地址向后移动了2个Byte,如果要将a的地址往后移动1个Byte的话,那么可以这样作
unsigned char *p = a;
p+1 ---------------- 此时就实现了a的地址向后移动1个Byte,因为unsigned char是以1个Byte来存放
这里可能有个疑问,unsigned char和char有什么区别呢?我们都知道,char其实是ASCII码,使用8个Bit来存储,但是最高位不考虑,也就是说只有1-127才有定义, 128以上的ASCII码是没有定义的(定义为扩展字符);但是unsigned char的话,128以上的字符他也可以认识,就是会显示为扩展字符,也就是说最高位如果为1,unsigned char也是可以显示和定义的
另外,在C中,对于struct,我们在引用其内部的element的时候,不要使用地址偏移的做法来作,要使用C语法中定义的.号和-> 号来取,因为struct在内存中存放的时候有一个地址对齐的做法,如果我们使用将struct的基地址向后偏移的方式来取其中的element,那么可 能会出现问题的
a+1整个表达式就等于a[1]
此时如果假设在系统中,一个int使用2个Byte来存储,那么a+1这个表达式其实是将
a的地址向后移动了2个Byte,如果要将a的地址往后移动1个Byte的话,那么可以这样作
unsigned char *p = a;
p+1 ---------------- 此时就实现了a的地址向后移动1个Byte,因为unsigned char是以1个Byte来存放
这里可能有个疑问,unsigned char和char有什么区别呢?我们都知道,char其实是ASCII码,使用8个Bit来存储,但是最高位不考虑,也就是说只有1-127才有定义, 128以上的ASCII码是没有定义的(定义为扩展字符);但是unsigned char的话,128以上的字符他也可以认识,就是会显示为扩展字符,也就是说最高位如果为1,unsigned char也是可以显示和定义的
另外,在C中,对于struct,我们在引用其内部的element的时候,不要使用地址偏移的做法来作,要使用C语法中定义的.号和-> 号来取,因为struct在内存中存放的时候有一个地址对齐的做法,如果我们使用将struct的基地址向后偏移的方式来取其中的element,那么可 能会出现问题的
相关文章推荐
- 一些字符串及内存操作函数的实现
- 与二叉树有关的一些操作:先序,中序,后序,层次遍历,计算深度,叶结点数
- 一些有关C++语言中的bit操作
- ORACLE数据库操作的一些小Tip
- 一些有关C++语言中的bit操作
- allocator类和new运算符的一些关于内存的操作
- Java String类一些操作的内存问题
- 操作内存的一些函数
- 有关树二叉树的一些操作
- PHP内存释放有关的操作
- Iphone数组一些基础操作 NSArray/NSMutableArray,以及内存注意问题。
- C 中内存的一些操作
- 有关字符串的一些操作
- 一些有关Android图片的操作,判断方向,旋转,根据uri获取绝对路径,缩放与移动
- 有关表分区的一些维护性操作:
- 有关EXE加载和调用DLL函数的例子;用ATL函数修改注册表和内存存贮的一些认识(一)
- 有关内存监控的一些知识
- 有关内存泄露检测的一些知识。
- 有关XML的一些操作
- 一些字符串及内存操作的函数