3

我已经尝试了以下代码的输出。但是,我还不明白 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 时打印的值是多少?

4

7 回答 7

2

只需打印变量的值和 ardess,您将看到:

   x: 5                     &x: 0x7fff691dfcc4
   p: 0x7fff691dfcc4        &p: 0x7fff691dfcb8
   q: 0x7fff691dfcb8        &q: 0x7fff691dfcb0

&var - location; 
 var - value
于 2014-11-27T08:50:25.040 回答
1

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

于 2014-11-27T08:44:51.487 回答
1

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

我们先来分析一下pp是 8 个字节,用于存储(变量的x)地址。打印*p将打印驻留在该地址的值,即 variable 值的 4 个字节x。打印只会p打印 8 字节中存储的地址p

现在,这同样适用于q. q是 8 个字节存储变量的地址p。因此打印*p将打印驻留在该地址的值,即 的值的 8 个字节p。打印只会q打印 8 字节中存储的地址q

于 2014-11-27T08:47:01.630 回答
1

诠释 x = 1;

分配一块内存来保存 int 值。该块被命名为“x”。假设 x 分配在 0x1234。

诠释* 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 的位置。

希望我简单明了...

于 2014-11-27T08:56:57.290 回答
1

指针只是一种数据类型,与其他类型没有太大区别。它存储了另一个数据对象的地址,您可以使用 *p 访问该数据对象。因此,指针与其他类型没有什么不同,但它们的内容有一些特殊的含义。

(int**) 是这样一个指针,它指向 (int*) 类型的数据对象,与其他指针没有太大区别(它们可能指向 int 类型的数据对象)。

因此,q 的内容是指向 p 的指针。*q 表示您使用内容来查找 p。p 的内容是指向 Integer 的指针,*p 表示您使用内容来查找整数。

于 2014-11-27T09:12:23.357 回答
1

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

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

于 2014-11-27T09:33:00.947 回答
1

你说:

打印 *q 将打印 p 的地址

然而,这不是真的。打印q将打印 的地址p。毕竟,你在做q = &p;.

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

于 2014-11-27T09:35:15.873 回答