指针和指针的地址如何共享同一个内存地址? [复制]

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] 的指针。那么&arar 怎么能一样呢? ar不是指向ar[0]的指针,&ar是指针ar的内存位置吗?

int ar[3] = 1,2,3;
cout<<ar<<endl;
cout<<&ar<<endl;

【问题讨论】:

它们产生相同的结果。然而,&amp;ar[0]+1 会产生与&amp;ar+1 不同的东西。 (试试看!) 指向第一个数组元素的指针(显式获得&amp;ar[0] 或隐式获得ar)和指向整个数组的指针(&amp;ar)指向相同的内存位置。请注意,在&amp;ar 中,数组不会隐式转换为指向第一个元素的指针,ar 仍然是一个数组。 类似问题:***.com/questions/8412694/address-of-array ar 不是指针。所以问题更像是“数组和数组的地址如何共享相同的值?” 请注意,"cout&lt;&lt;ar&lt;&lt;endl; cout&lt;&lt;&amp;ar&lt;&lt;endl;" 可以打印出不同的文本,但引用相同的地址。要查看指针是否引用相同的地址,请使用 ==: "cout&lt;&lt; (ar == &amp;ar)&lt;&lt;endl; 【参考方案1】:

    &amp;ar是数组的地址,它的类型是“指向三个整数数组的指针”。

    ar,当传递给 ostream 时,会衰减为指向其第一个元素的指针,该元素的类型为“指向整数的指针”。当它被分配给相应的指针时也会发生同样的情况。

    打印指针时,除了指向charunsigned charsigned char 的指针,指针将转换为“指向void 的指针”。

总而言之,打印数组或打印第一个元素的地址会产生相同的输出,因为数组的地址也是第一个元素的地址。它们的类型不同,但这无关紧要,因为它们无论如何都会转换为 void。

【讨论】:

所以 ar 最初不是指针。调用的时候就衰减到它,不衰减的时候是什么? @Crazy_Boy53 没有衰减它只是一个数组。它的类型是int[3] ar 是一个数组。使用例如sizeof 获取其大小或typeid 进一步探索。 cout&lt;&lt;(ar + 1)&lt;&lt;endl; cout&lt;&lt;(&amp;ar+1)&lt;&lt;endl; 是说明性添加以显示类型差异。 我猜ar+1就是&ar[1],&ar+1对应什么?

以上是关于指针和指针的地址如何共享同一个内存地址? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Go 如何查看一个变量的内存地址 理解指针问题

两个指针指向同一个地址,怎样只改变其中的一个指针的内容

为啥 gorm db.First() 会因“无效的内存地址或 nil 指针取消引用”而恐慌? [复制]

C语言如何给指针分配内存?

浅拷贝深拷贝

指针定义NULL后无法赋值?