int *ptrl=(int*)(&a+1); int *ptr=(int*)((int)a+1);这两个定义有啥区别?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了int *ptrl=(int*)(&a+1); int *ptr=(int*)((int)a+1);这两个定义有啥区别?相关的知识,希望对你有一定的参考价值。

第二个为什么要强制转换两次?还不给付地址?
大神帮我详细解释一下这两条语句吧。

int *ptrl=(int*)(&a+1),第一个变量,将a的地址往后偏移一个单位。注意,这里的一个单位是sizeof(a的数据类型),然后再将这个地址转化为int 类型的指针地址。
int *ptr=(int*)((int)a+1),简单起见可以假设a原来的数据类型是double,这里先将a下转型成int类型,假设转换之后(int )a=99,则处理为int *ptr=(int *)100; 也就是ptr 指向内存中位置为100的地方,这时候如果输出ptr,ptr=100,如果输出*ptr的话,就不可知了,因为那个地方原本放什么东西不可预测。追问

第二个中。经过第一个int不是已经把a转换为整型了吗?又加一个(int*)是为什么呢?
还有就是能否留个联系方式,再有问题可以向你请教,不知方便否?

追答

加一个(int *)只是告诉编译器,在取地址100指向的内存块的具体数值的时候,要按照int类型来解析读取,也就是4个字节的一个有符号数。读出来时候具体而言就是内存为100-103这4个字节块的二进制码代表的整形值。

参考技术A 首先,a是一个数组名(不然这样写没啥意义,本题考的是数组指针和数组首元素指针的区别)
那么&a表示整个数组的指针,它的值和数组a首元素的地址值一样,但是这个指针指向的内存大小是整个数组的总大小。那么&a+1表示的就是整个数组a最后一个元素的下一个内存单元开始数组指针,再把这个指针转换成int的指针,那么ptrl就指向了数组a最后一个元素之后的下一个内存单元开始的4个字节(int*)内存。

单单的a表示的是数组a的首元素的指针,把它转换成int就是取这个地址值,然后加一,再转换成int*类型的指针,那么ptr的值就是数组a首元素中从第二个字节开始的三个字节,再加上数组a第二个元素的第一个字节,一共这四个字节的指针。
参考技术B 这段代码应该出自<<C语言深度剖析>>陈正冲 著 在前面部分他就给出了这段代码,在后面他有做过详细的解释,在这里我只给楼主将楼下的回答做下参考并做简要分析:

底楼完全不懂指针跟数组之间的关系,建议楼主直接略过!

4楼的解释是非常正确的。想必4楼似乎精通指针跟数组之间的微妙的种种联系,似乎也懂汇编语言

完整的代码应该是这样的吧 楼主?:
int main()

int a[5]=1,2,3,4,5;
int *ptr1=(int*)(&a+1);
int *ptr2=(int*)((int)a+1);
printf("%x,%x",ptr1[-1],*ptr2);
return 0;


第一个输出的是5 毫无疑问,4楼给了你很详细的解答

第二个的输出 在不同的cpu上结果是不一样的
在 小端存储的CPU (intel这些)上 数组a的内存布局如下:(简单起见,内存地址这里从0开始)
00000000 :01 00 00 00 02 00 00 00
00000008 :03 00 00 00 04 00 00 00
00000010 :05 00 00 00

由于a的值 就是00000000 但是对a=a+1 之后 a会变成 00000004,因为加的是1*sizeof(int)个字节,但是把a强制类型转换成int之后就编变成 数值 00000000 了,不在有地址的任何附加属性,对其进行+1 操作也是纯粹数学上的加1 变成00000001
此时又强制类型转换成(int*) 那么此时指向的内存内容是 00 00 00 02 00 00 00

对其取内容(以%x的方式取,取4个字节) 取出来 是00 00 00 02 ,这个按16进制解释出来就是 2000000

大端存储大同小异:内存布局 00 00 00 01 00 00 00 02
(int*)((int)a+1)之后指向 00 00 01 00 00 00 02

结果便是10000(一般单片机是大端存储的,摩托罗拉的芯片也是)
参考技术C 这两个的作用是一样的,都是把a指针指向的位置向后移一个元素。只是这两种写法实在太2。如果想从第一个元素指向第二个元素,只要这样写就行 int * ptr = a[1],这就是指向第二个元素了来自:求助得到的回答 参考技术C 第一个表示变量a的地编译1个单位,然后将这个指针强制转化int类型的指针赋予ptrl
第二个表示将a变量强制转换为int类型,然后+1,然后将这个值强制换为int指针赋予ptr
两个赋值得到的值截然不同

以上是关于int *ptrl=(int*)(&a+1); int *ptr=(int*)((int)a+1);这两个定义有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

定义int i=1,在执行while(i++<5)后,i的值为?为啥呢

auto fn = [](int *a) for (int i = 0; i < 10; i++) cout << *a << endl; ;

int a[3] = 1,2,3; int*p, *q; p = a; q = &a[2]; int i = q-p;为何i的结果为1而不是8,C语言的规定?

#include <stdio.h> int i,e,a[]; int *begin,*end; int make(int a[]) int b,e=0; printf("请输

java初学者问题 有一个整数数组int[] a = 1, 2, 3, 4, 5, ……, 98, 99, 100

如何阅读uniform_int_distribution概率质量函数?