我已尝试过以下代码的输出。但是,我还不知道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时打印的值是多少?
答案 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。)
让我们先分析p
。 p
是8个字节,存储地址(变量x
)。打印*p
将打印驻留在该地址的值,该值是变量x
的值的4个字节。仅打印p
将打印p
中存储的地址的8个字节。
现在,这同样适用于q
。 q
是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
的地址。