繁体   English   中英

如果不使用单个解除引用运算符,指针指针的打印值是多少?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM