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

时间:2014-11-27 08:34:46

标签: c++ pointers pointer-to-pointer

我已尝试过以下代码的输出。但是,我还不知道q的价值可能代表什么。

我理解* q指向p意味着,打印* q将打印p的地址,其中** q将打印地址p处的值,即x(= 5)。< / p>

#include <iostream>
using namespace std;
int main()
{
    int x=5;
    int *p,**q;
    p=&x;
    q=&p;
    cout<<q;
    return 0;
}

那么q单独代表什么?打印q时打印的值是多少?

7 个答案:

答案 0 :(得分:2)

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

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

&var - location; 
 var - value

答案 1 :(得分:1)

由于q是指向p的指针,因此q的值是p的位置,无论在此特定平台上的含义如何。 (很可能是包含p值的内存地址。)

答案 2 :(得分:1)

(我将在这个答案中假设64位指针和32位整数,只是为了得到具体的值。尽管如此,它仍适用于任何vaues。)

让我们先分析pp是8个字节,存储地址(变量x)。打印*p将打印驻留在该地址的值,该值是变量x的值的4个字节。仅打印p将打印p中存储的地址的8个字节。

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

答案 3 :(得分:1)

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

希望我简单明了......

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

你说:

  

打印* q会打印p

的地址

但事实并非如此。打印q会打印p的地址。毕竟,您在执行q = &p;时已分配了该内容。

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