指针和指针的地址如何共享同一个内存地址? [复制]
Posted
技术标签:
【中文标题】指针和指针的地址如何共享同一个内存地址? [复制]【英文标题】:How the pointer and the pointer's adress can share the same memory adress? [duplicate] 【发布时间】:2018-11-03 13:58:32 【问题描述】:在这段代码中,我读到ar
等同于&ar[0]
,所以我们可以在使用指针的同时编写int* pointer = ar;
。看来ar
是指向ar[0]
的指针。那么&ar
和ar
怎么能一样呢? ar
不是指向ar[0]
的指针,&ar
是指针ar
的内存位置吗?
int ar[3] = 1,2,3;
cout<<ar<<endl;
cout<<&ar<<endl;
【问题讨论】:
它们产生相同的结果。然而,&ar[0]+1
会产生与&ar+1
不同的东西。 (试试看!)
指向第一个数组元素的指针(显式获得&ar[0]
或隐式获得ar
)和指向整个数组的指针(&ar
)指向相同的内存位置。请注意,在&ar
中,数组不会隐式转换为指向第一个元素的指针,ar
仍然是一个数组。
类似问题:***.com/questions/8412694/address-of-array
ar
不是指针。所以问题更像是“数组和数组的地址如何共享相同的值?”
请注意,"cout<<ar<<endl; cout<<&ar<<endl;"
可以打印出不同的文本,但引用相同的地址。要查看指针是否引用相同的地址,请使用 ==
: "cout<< (ar == &ar)<<endl;
。
【参考方案1】:
&ar
是数组的地址,它的类型是“指向三个整数数组的指针”。
ar
,当传递给 ostream 时,会衰减为指向其第一个元素的指针,该元素的类型为“指向整数的指针”。当它被分配给相应的指针时也会发生同样的情况。
打印指针时,除了指向char
、unsigned char
和signed char
的指针,指针将转换为“指向void 的指针”。
总而言之,打印数组或打印第一个元素的地址会产生相同的输出,因为数组的地址也是第一个元素的地址。它们的类型不同,但这无关紧要,因为它们无论如何都会转换为 void。
【讨论】:
所以 ar 最初不是指针。调用的时候就衰减到它,不衰减的时候是什么? @Crazy_Boy53 没有衰减它只是一个数组。它的类型是int[3]
。
ar
是一个数组。使用例如sizeof
获取其大小或typeid
进一步探索。
cout<<(ar + 1)<<endl; cout<<(&ar+1)<<endl;
是说明性添加以显示类型差异。
我猜ar+1就是&ar[1],&ar+1对应什么?以上是关于指针和指针的地址如何共享同一个内存地址? [复制]的主要内容,如果未能解决你的问题,请参考以下文章