注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

学习笔记

正确的方法如同学习书法,开始的时候要临摹,临摹好了然后创造自己的风格。

 
 
 

日志

 
 

[C/C++笔记]地址的强制转换  

2011-10-23 18:20:06|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//main.cpp
int main()
{
 int a[4]={1,2,3,4};
 int *ptr1=(int *)(&a+1); //&a即为数组a的首地址
 int *ptr2=(int *)((int)a+1);  //元素a[0]的第二个字节的地址
 int *ptr3=(int *)(a+1); //取出数组a的首元素的首地址,然后加上1*sizeof(int)的偏移量。即为a[1]
 printf("%x,%x,%x\n",ptr1[-1],*ptr2,*ptr3);
 return 0;
}

运行结果:
4,2000000,2
分析一下int *ptr2=(int *)((int)a+1)

[C/C++]地址的强制转换 - Fantity Wei - FootPrints

图1 内存布局图

好了,问题来了,这连续的4个byte里到底存了什么东西呢?也就是说元素a[0],a[1]里面的值到底怎么存储的。这就涉及到系统的大端小端模式了。可以用下面的函数来测试当前系统的模式。

#include <stdio.h>
int checkSystem()
{
union check
{
   int i;
   char ch;
}c;
c.i=1;
return(c.ch==1);
}
int main()
{
if(checkSystem())
   printf("The system is Little_edian");
else
   printf("The system is Big_edian");
}

也就是说,如果此函数返回值为1的话,*ptr2的值为0x2000000,如果此函数返回值为0的话,*ptr2的值为0x100。
 
看下面的例子:

struct Test
{
int Num;
char *pcName;
short sDate;
char cha[2];
 short sBa[4];
}*p;

假定p=0x100000,下面的表达式的值分别为多少?
一个指针跟一个变量相加减并不是用指针变量里的地址直接加减这个整数。这个整数的单位是元素的个数而不是byte。
      p+0x01=0x100000+sizeof(struct Test)*1=0x100000+14=0x100014
      (unsigned long)p+0x01=0x100000+(unsigned long)1=0x100001
      (unsigned int *)p+0x01=0x100000+sizeof(unsigned int)*1=0x100000+4=0x100004
这里的p被强制转化成一个指向无符号整型的指针。
  评论这张
 
阅读(1189)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017