&a+1和(int )a+1的分析
来源:互联网 发布:单片机蓝牙程序 编辑:程序博客网 时间:2024/06/11 10:18
1、void 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为数组首地址和a即a[0]的地址一样0x0012ff50, &a 的类型是 int(*)[5] 指针——指向int[5]数组的首指针
a为数组首元素首地址为0x0012ff50即a[0]的地址, a 的类型是 int[5] 数组
a+1即为a[0]的首地址+1,即为&a[0]+sizeof(int)=0x0012ff50+4=0x0012ff54,
&a+1即数组的首地址+这个数组的长度 即 0x0012ff50+5*sizeof(int)=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为指针 所以sizeof(p)=4
*p占20字节
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的值就要考虑计算机的大小端模式了,我的电脑为小端模式,所以值为33554432(16进制0x2000000)。
- &a+1和(int )a+1的分析
- (int&)a和(int)a, (int)&a, &a的区别
- (int&)a和(int)a的区别
- (int&)a和(int)a的区别
- (int&)a和(int)a的区别
- (int&)a和(int)a的区别
- (int&)a和(int)a的区别
- (int&)a和(int)a的区别
- (int&)a和(int)a的区别
- (int&)a和(int)a的区别
- (int&)a和(int)a的区别
- int *a 和 int* a 的区别
- (int&)a和(int)a的区别
- (int&)a和(int)&a的区别
- (int&)a和(int)a的区别
- (int)a和(int&)a的区别
- (int&)a和(int)a的区别
- (int &)a 和(int)a
- 漫谈数据库索引
- Kbuild Makefiles详解 (翻译linux下Documentations/kbuilt/makefiles)
- 接口和抽象类的区别
- 实例讲解override和new的区别
- 看一只鸟儿从头顶掠过
- &a+1和(int )a+1的分析
- openfire源码导入到eclispe下
- 使用Python进行TCP数据包注入(伪造)
- override和new的区别?
- 微视频会步腾讯微博的后尘吗?短视频应用值得深思
- MATLAB里的使用
- override和new的区别
- 读《费马大定理——一个困惑了世间智者358年的迷》
- SQL语句:如何向表中插入特殊字符?