C++ C+中的指针+;同一变量有两个不同的地址
通常,使用此代码,我们应该获得相同的指针地址: 如果我们通常有这样一个代码,C++ C+中的指针+;同一变量有两个不同的地址,c++,pointers,C++,Pointers,通常,使用此代码,我们应该获得相同的指针地址: 如果我们通常有这样一个代码,i和&i指向同一地址 int *i=NULL; int k=5; i=&k; printf("%p %p",&i,i); 以下是printf的结果(只有最后一位不同):0x7fff5fbff8b8 0x7fff5fbff8b4 谁能解释一下原因吗?因为它们不一样i是包含变量k地址的指针,&i是包含变量i地址的指针,因为它们不相同i是包含变量k地址的指针,&i是包含变量i地址的指针i是指向整数的指针i的值
i
和&i
指向同一地址
int *i=NULL;
int k=5;
i=&k;
printf("%p %p",&i,i);
以下是printf的结果(只有最后一位不同):0x7fff5fbff8b8 0x7fff5fbff8b4
谁能解释一下原因吗?因为它们不一样
i
是包含变量k
地址的指针,&i
是包含变量i
地址的指针,因为它们不相同i
是包含变量k
地址的指针,&i
是包含变量i
地址的指针i
是指向整数的指针i
的值是一个地址(k的地址)
&i
是i
的地址
您只需输出两个不同的地址
您可以这样做:
#include <cstdio>
int main()
{
int *i=NULL;
int k=5;
i=&k;
int** j = &i;
printf("%p %p %p",&i,i,j);
}
请看第一个地址与第三个地址相同。因为
j
的值是i
的地址。i
是指向整数的指针i
的值是一个地址(k的地址)
&i
是i
的地址
您只需输出两个不同的地址
您可以这样做:
#include <cstdio>
int main()
{
int *i=NULL;
int k=5;
i=&k;
int** j = &i;
printf("%p %p %p",&i,i,j);
}
请看第一个地址与第三个地址相同。因为
j
的值是i
的地址。@Zaibis它是。这就像数字42
是一个常数,但也是一个int
。引用C++11§5.3.1:一元&
运算符的结果是指向其操作数的指针。@Yu Hao,好吧,但C标准对它的描述有点不同;)引用ISO/IEC 9899:TC3 6.5.3.23一元运算符&生成其操作数的地址。如果操作数的类型为“type”,则结果的类型为“pointer to type”。
它表示返回类型为指针类型,但这并不意味着它是指针,因为int foo(void){return 5;}
的结果类型为int
,但不能说foo()
是一个itneger;D@Zaibis在C中类似。您引用的标准与函数返回类型无关。根据结果,作为另一个示例,1+2
的结果的类型为int
。我想你的意思是,&I
不是指针变量,但我的观点是它仍然是指针。Apointer类型可能来自函数类型、对象类型或不完整类型,称为引用类型。指针类型描述一个对象,其值提供对所引用类型的实体的引用。从引用类型T派生的指针类型有时称为“指向T的指针”。从引用类型构造指针类型称为“指针类型派生”。
hm ohkay。。。。你跟我打赌。。。。但无论如何,它并没有说它是正确的。这就像数字42
是一个常数,但也是一个int
。引用C++11§5.3.1:一元&
运算符的结果是指向其操作数的指针。@Yu Hao,好吧,但C标准对它的描述有点不同;)引用ISO/IEC 9899:TC3 6.5.3.23一元运算符&生成其操作数的地址。如果操作数的类型为“type”,则结果的类型为“pointer to type”。
它表示返回类型为指针类型,但这并不意味着它是指针,因为int foo(void){return 5;}
的结果类型为int
,但不能说foo()
是一个itneger;D@Zaibis在C中类似。您引用的标准与函数返回类型无关。根据结果,作为另一个示例,1+2
的结果的类型为int
。我想你的意思是,&I
不是指针变量,但我的观点是它仍然是指针。Apointer类型可能来自函数类型、对象类型或不完整类型,称为引用类型。指针类型描述一个对象,其值提供对所引用类型的实体的引用。从引用类型T派生的指针类型有时称为“指向T的指针”。从引用类型构造指针类型称为“指针类型派生”。
hm ohkay。。。。你跟我打赌。。。。但无论如何,它说的都不对^^非常感谢你的解释:)感谢:)非常感谢你的解释:)感谢:)