[英]What value does a Pointer to a Pointer print if not a single dereference operator is used at all?
我已经尝试了以下代码的输出。 但是,我还不知道q的价值可能代表什么。
我理解* q指向p暗示,打印* q将打印p的地址,其中** q将打印地址p处的值,即x(= 5)。
#include <iostream>
using namespace std;
int main()
{
int x=5;
int *p,**q;
p=&x;
q=&p;
cout<<q;
return 0;
}
那么q单独代表什么呢? 打印q时打印的值是多少?
只需打印变量的值和ardess,您将看到:
x: 5 &x: 0x7fff691dfcc4
p: 0x7fff691dfcc4 &p: 0x7fff691dfcb8
q: 0x7fff691dfcb8 &q: 0x7fff691dfcb0
&var - location;
var - value
由于q
是指向p
的指针,因此q
的值是p
的位置,无论这个特定平台是什么意思。 (很可能是包含p
值的内存地址。)
(我将在这个答案中假设64位指针和32位整数,只是为了有具体的值来写。尽管如此,它仍适用于任何vaues)。
我们先来分析一下p
。 p
是8个字节,存储(变量x
)地址。 Printing *p
将打印驻留在该地址的值,即变量x
的值的4个字节。 仅打印p
将打印存储在p
的8个字节的地址。
现在,这同样适用于q
。 q
是存储变量p
的地址的8个字节。 因此,打印*p
将打印驻留在该地址的值,即p
值的8个字节。 仅打印q
将打印存储在q
的8个字节的地址。
int x = 1;
分配一块内存来保存int值。 该块名为“x”。 假设x在0x1234分配。
int * p;
这里'p'是指向int的指针,这意味着p将包含某些int的地址。 假设p被分配地址0x2345。
p = &x;
这将使p包含x的地址,即0x1234将存储在分配给p的位置。
int **q;
这里q是指向int的指针,这意味着q将包含指向int的指针的地址。 假设q被分配地址0x3456。
q = &p;
这将使q包含p的地址,即0x2345将存储在分配给q的位置。
希望我简单明了......
指针只是一种数据类型,与其他类型没有太大区别。 它存储另一个数据对象的地址,您可以使用* p来访问数据对象。 因此,指针与其他类型没有区别,但它们的内容具有一些特殊含义。
(int **)是指向类型(int *)的数据对象的指针,与其他指针(它们可能指向int类型的数据对象)没有太大区别。
因此,q的内容是指向p的指针。 * q表示您使用内容来查找p。 p的内容是指向Integer的指针,* p表示您使用内容来查找整数。
通过在q的声明中在q之前添加**,你要对编译器说,q是一个指向指针地址的指针。 因此,当您打印q时,实际上是打印p指针的地址,而不是地址p指向的值(即x)。
在您的代码中,p是一个存储整数地址的指针。 但是p本身有一个地址,你在q中存储。
你说:
打印* q将打印p的地址
但事实并非如此。 打印q
将打印p
的地址。 毕竟,你在做q = &p;
分配了它q = &p;
。
打印*q
将打印p
的值,即x
的地址。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.