&a+1和(int )a+1的分析

来源:互联网 发布:单片机蓝牙程序 编辑:程序博客网 时间:2024/06/11 10:18

1void main ()
    {
      int a[5]={1,2,3,4,5};
      int *p=(int*)(&a+1);
     printf("%d\n,%d\n",*(a+1),*(p-1));
    }


 首先解释 a&a   他两的值一样但是意义不同,a表示的是数组首元素的首地址(处于元素层,加减是以元素所占内存大小为单位计算),&a表示的是数组的首地址(以数组整个长度为单位进行计算)。这样再来解释监视窗口的值的得来,首先

    &a为数组首地址aa[0]的地址一样0x0012ff50 &a   的类型是 int(*)[5]   指针——指向int[5]数组的首指针

    a为数组首元素首地址为0x0012ff50a[0]的地址,     a     的类型是 int[5]      数组

    a+1即为a[0]的首地址+1,即为&a[0]+sizeofint=0x0012ff50+4=0x0012ff54

    &a+1即数组的首地址+这个数组的长度     0x0012ff50+5*sizeofint=0x0012ff50+20=0x0012ff64显然已经超越了数组的界限。

    p&a+1强制转换的地址即为0x0012ff64

   所以 *(a+1)=a[1]=2

    *(p-1)=a[4]=5


&a[0]
的类型是 int *        指针——指向int类型的指针。

sizeof(a)=20;
sizeof(*a)=4 =sizeof(a[0]);
sizeof(*&a)=20;//
因为p=&a,所以=sizeof(*p),*p=a,所以=sizeof(a)=20;


2

#include<stdio.h>
void main ()
{
 struct Test
 {
  int Num;                //4
字节
  char *pcNume;     // 4
字节
  short sDate;         //2
字节
  char cha[2];          //2
字节
  short sBa[4];        //8
字节
 }*p;
}

问题: p+0x1=

          unsigned int*p+0x1=?

           (unsignedlong)p+0x1=?              问题目的:搞懂一个指针变量与一个整数相加减,怎么解析。


 分析:p为指针 所以sizeofp=4

           *p20字节

           P的值为0xcccccccc

           p+0x1的值为0xcccccccc+sizeof(*p)  *  0x1=0xcccccccc+0x14=0xcccccce0

                /////////&a+1一样,指针变量与一个整数相加减并不是用指针变量里的地址直接相加减,这个整数的单位不是byte而是元素的个数。

          (unsignedint*)p  这里被强制转换成一个指向无符号整型的指针

             所以(unsigned int*p+0x1=0xcccccccc+sizeof(unsigneint)  * 0x1=0xcccccccc+0x4=0xccccccd0

         (unsignedlong)p  任何数据一旦强制转换,其类型就改变,所以P不再是指针,他的值依然是0xcccccccc(十进制为3435973836),只是

            (unsignedlong)p+0x1变成了一个无符号数加上一个整数,其值为0xcccccccd.

 3

void main()
{
 int a[4]={1,2,3,4};
 int *ptr1=(int*)(&a+1);
 int *ptr2=(int*)((int)a+1);
   printf("%x,%x",ptr1[-1],*ptr2);   //ptr1[-1]=*(ptr1-1)
}

 


 分析:  a代表数组的首元素的首地址,(int)a强制转换后为一个整数,转换后 a不再代表地址,所以加1,相当于直接加1,再经过强制转换成地址赋给ptr2,,则这时ptr2所指的地址为a[0]的第二个字节(a[0]共占4个直接),所以ptr2的值为0x0012ff54+1=0x0012ff55开始的四个字节。*ptr2的值就要考虑计算机的大小端模式了,我的电脑为端模式,所以值为3355443216进制0x2000000)。


0 0
原创粉丝点击