int a={1,2,3,4}; int *p=(int *)((int)a+1); P指向了什么?
展开全部
1. int a = {}; 貌似应该是int a[] = {};
2. "(int)a",已经把a的地址强转成int型数字(32bit),所以“((int)a+1); ”实际指向了整个数组内存块的第二个地址,即a[0]的第二个字节。
3.这种用法比较危险,特别是在某些特殊处理器上,如果对32bit(int)变量的访问,访问地址不是4字节对齐的话,会有想不到的副作用。你可以将内存看做是一个字符型的大数组,指针其实也是一个整数,它存贮着某个整型值,假设内存数组名为M,那么访问指针指向的元素其实就是M[(int)p]。在对指针本身做加减法的时候,如果增加或者减小到的值为1,那么系统其实默认的得到的指针值是 p + sizeof(T) * 1,这里你吧a转换成了一个整数,并取得了该整数加1的值,其实你的到的是p + 1,所以p的指向就向前移动了一个字节,指向了a【0】的第二个字节的地址。
2. "(int)a",已经把a的地址强转成int型数字(32bit),所以“((int)a+1); ”实际指向了整个数组内存块的第二个地址,即a[0]的第二个字节。
3.这种用法比较危险,特别是在某些特殊处理器上,如果对32bit(int)变量的访问,访问地址不是4字节对齐的话,会有想不到的副作用。你可以将内存看做是一个字符型的大数组,指针其实也是一个整数,它存贮着某个整型值,假设内存数组名为M,那么访问指针指向的元素其实就是M[(int)p]。在对指针本身做加减法的时候,如果增加或者减小到的值为1,那么系统其实默认的得到的指针值是 p + sizeof(T) * 1,这里你吧a转换成了一个整数,并取得了该整数加1的值,其实你的到的是p + 1,所以p的指向就向前移动了一个字节,指向了a【0】的第二个字节的地址。
展开全部
你可以将内存看做是一个字符型的大数组,指针其实也是一个整数,它存贮着某个整型值,假设内存数组名为M,那么访问指针指向的元素其实就是M[(int)p]。在对指针本身做加减法的时候,如果增加或者减小到的值为1,那么系统其实默认的得到的指针值是 p + sizeof(T) * 1,这里你吧a转换成了一个整数,并取得了该整数加1的值,其实你的到的是p + 1,所以p的指向就向前移动了一个字节,指向了a【0】的第二个字节的地址。
其实指针的这种特性会经常使用在同种类型值需要不同解释的情况,比如要判断机器的大小端(大小端可以上网查询),你可以定义一个共用体:
union {
int ele;
}hl;
在程序中你可以初始化:
hl.ele = 0;
然后你再定义一个字符型指针:
char *p = hl.ele[0];
你就可以通过(*p)的值判断机器的大小端了。
其实指针的这种特性会经常使用在同种类型值需要不同解释的情况,比如要判断机器的大小端(大小端可以上网查询),你可以定义一个共用体:
union {
int ele;
}hl;
在程序中你可以初始化:
hl.ele = 0;
然后你再定义一个字符型指针:
char *p = hl.ele[0];
你就可以通过(*p)的值判断机器的大小端了。
追问
我还是无法理解为什么(int)a这个表达式是取得一个字节,而不能看成是一个强制转换呢?
追答
a本身是一个指针,但在这里你把它转换成了一个整形值了,所以在这里a+1就是a+1,是按照整形的加法进行的,但是指针的加法是在你加的数字基础上再乘上指针指向的类型所占的字节,就是n*sizeof(T)。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1. int a = {}; 貌似应该是int a[] = {};
2. "(int)a",已经把a的地址强转成int型数字(32bit),所以“((int)a+1); ”实际指向了整个数组内存块的第二个地址,即a[0]的第二个字节。
3.这种用法比较危险,特别是在某些特殊处理器上,如果对32bit(int)变量的访问,访问地址不是4字节对齐的话,会有想不到的副作用。
2. "(int)a",已经把a的地址强转成int型数字(32bit),所以“((int)a+1); ”实际指向了整个数组内存块的第二个地址,即a[0]的第二个字节。
3.这种用法比较危险,特别是在某些特殊处理器上,如果对32bit(int)变量的访问,访问地址不是4字节对齐的话,会有想不到的副作用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
2
更多追问追答
追问
如果输出是2,程序是这样写的int *p=(int *)(a+1);我看了下(int)a+1指向的是a【0】的第二个字节的地址,这个我就不能理解了
追答
a[0]不是只有一个字节吗,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询