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】的第二个字节的地址。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-11-08
你可以将内存看做是一个字符型的大数组,指针其实也是一个整数,它存贮着某个整型值,假设内存数组名为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)的值判断机器的大小端了。追问

我还是无法理解为什么(int)a这个表达式是取得一个字节,而不能看成是一个强制转换呢?

追答

a本身是一个指针,但在这里你把它转换成了一个整形值了,所以在这里a+1就是a+1,是按照整形的加法进行的,但是指针的加法是在你加的数字基础上再乘上指针指向的类型所占的字节,就是n*sizeof(T)。

本回答被网友采纳
第2个回答  2012-11-08
1. int a = {}; 貌似应该是int a[] = {};
2. "(int)a",已经把a的地址强转成int型数字(32bit),所以“((int)a+1); ”实际指向了整个数组内存块的第二个地址,即a[0]的第二个字节。
3.这种用法比较危险,特别是在某些特殊处理器上,如果对32bit(int)变量的访问,访问地址不是4字节对齐的话,会有想不到的副作用。
第3个回答  2012-11-08
2追问

如果输出是2,程序是这样写的int *p=(int *)(a+1);我看了下(int)a+1指向的是a【0】的第二个字节的地址,这个我就不能理解了

追答

a[0]不是只有一个字节吗,

追问

int4字节啊大哥

追答

多谢指教

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...

...{1,2, 3, 4,5}; int *ptr2 = (int*)((int)a +1); 下面那一句是什么意...
翻译一下:int *ptr2 = ***;声明一个整形指针指向某个地址;这个地址是:(int*)((int)a+1);(int)a,a是数组名,也是数组首地址,一般是32为的某一个数值,比如说 a =0x12345678,(int)a将a转换成整型值,0x12345678,然后将这个数值加1,变成0x12345679,然后再将其转换成地址,兜了一大...

int a[]={1,2,3,4,5}; int *p=a; printf("%d\\n",*p); 为什么结果是1呢...
(*P)++先复制=0;(++p)中++p自加1,变为坐标为1的元素,a[1]=*(++p)=2;p此时也指向a[1]的,*p=2;

int *ptr=(int *)(&a+1)
(int*)(&a+1)把这个相邻地址显式类型转换为int类型的地址int*ptr=(int*)(&a+1);所以ptr指向&a[5],并且ptr是一个int类型的指针。ptr-1=ptr-sizeof(int),故ptr-1指向&a[4]。因此,*(ptr-1)的值即为a[4]=5。

int a[5]={1,2,3,4,5}; int * ptr=(int *)(&a+1); 那个&a+1是哪个的...
int a[5]; 一个带有5个int空间的数组a &a 是指变量a的地址 &a + 1 表示的是 跳过一个“a[5]"大小的空间后的地址,即:a[5]的最后一个元素的后面

int a[]={1,2,3,4,5,6},int *p=a; 对p赋值的是数组a的第一个元素值还 ...
对p赋值的是数组a的 始地址,也就是 &a[0], 不是元素值。输出有2种方法:include <stdio.h> include <stdlib.h> main(){ int a[]={1,2,3,4,5,6};int *p=a;int i,n;n = sizeof(a)\/sizeof(int);for (i=0;i< n ;i++) printf("%d ", p[i]); \/\/输出 printf("\\...

int a[ ]={1,2,3,4};*P=a;则值为3时的表达式是A)P+=2;*(P++);B)P+...
选 A。p+=2是使指针指向第三个数据;*(p++)是先使用*p再使p的值加一;*++p则先使p加一,在使用*p,此时的值是4.

int a[]={1,2,3,4}, y, *p=a;执行y = (*++p)--;之后, a的值变为...
a 变 1,1,3,4 (*++p) 是前缀加,p要先增1, 初始化 p 指向 a[0], 增1, 指向 a[1],(*++p) 就是 a[1] 的值 a[1] -- 是 a[1] 的值 自减 1, 所以 a[1] 变 1。结果 a 数组 的 值 变 1,1,3,4 ...

int a[5]={1,2,3,4,5}; int * ptr=(int *)(&a+1); 那个&a+1是哪个的...
int a[5];一个带有5个int空间的数组a &a 是指变量a的地址 &a + 1 表示的是 跳过一个“a[5]"大小的空间后的地址,即:a[5]的最后一个元素的后面

...{ int a[5]={1,2,3,4,5}; int *p=(int *)(&a+1); printf("%d\\n",p...
int *p=(int *)(&a+1);对于a[5]来说a是该数组的首地址,而&a是该数组的行地址,虽然值是一样,但意义不同,而&a+1则表示该数组存储单元的后一个地址,a+1表示数组的第二个元素的地址。p[-1]表示p所在地址减一的地址下的值,也就是a[4]的值 ...

相似回答