如果根本不使用单个取消引用运算符,指向指针的指针打印什么值

What value does a Pointer to a Pointer print if not a single dereference operator is used at all?

本文关键字:指针 什么 打印 运算符 引用 取消 单个 如果      更新时间:2023-10-16

我已经尝试了以下代码的输出。但是,我还不明白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的地址。毕竟,你在做q = &p;时分配了它.

打印*q会打印p的值,即x的地址。

因为q是指向p的指针,q的值是p的位置,不管在这个特定的平台上意味着什么。(很可能是包含p 值的内存地址。

(我将在这个答案中假设 64 位指针和 32 位整数,只是为了写具体的值。不过,它适用于任何价值)。

我们先来分析一下pp 是存储地址(变量 x 的 8 个字节)。打印*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 的内容是指向整数的指针,*p 表示您使用内容查找整数。

通过在 q

的声明中在 q 之前添加 **,你是在对编译器说,q 是一个指向指针地址的指针。所以当你打印q时,你实际上是在打印p指针的地址,而不是地址p指向的值(即x)。

在您的代码中,p 是一个存储整数地址的指针。但是 p 本身有一个地址,你把它存储在 q 中。

相关文章: