C++ 指针和数组地址
我只是在玩指针,发现了这个奇怪的东西。我创建了指针C++ 指针和数组地址,c++,pointers,memory-address,C++,Pointers,Memory Address,我只是在玩指针,发现了这个奇怪的东西。我创建了指针p并显示了它的地址,正如我在下面的程序中所做的那样,p和&p的地址不同,为什么它们不同 int main() { int *p, s[5]; cout << p <<endl; cout << &p <<endl; p = s; cout << p <<endl; cout << &p <<
p
并显示了它的地址,正如我在下面的程序中所做的那样,p
和&p
的地址不同,为什么它们不同
int main()
{
int *p, s[5];
cout << p <<endl;
cout << &p <<endl;
p = s;
cout << p <<endl;
cout << &p <<endl;
}
intmain()
{
int*p,s[5];
coutp
是一个指针,意味着它拥有一个指向整数的地址。因此,当你打印p时,它会显示它指向的整数的地址。而当你打印&p
时,你实际上是在打印p本身的地址,而不是它指向的地址。正如Jeeva所说,指针p也占用了一部分内存(图中的黄色部分,其地址为0x300),在该区域中,它持有数组s的地址值。因此p==0x100和&p==0x300如果p
等于&p
,指针将指向自身,这仅在空指针下才可能:
void* p = &p;
assert(p == &p);
不过,我还没有看到它的实际用途:)
哦,等等,它也发生在自引用递归数据结构中,这可能非常有用:
struct X
{
X* p;
void print()
{
std::cout << " p = " << p << '\n';
std::cout << "&p = " << &p << '\n';
}
};
X x;
x.p = &x;
x.print();
为什么?因为一个对象在内存中的起始地址通常与它的第一个数据成员相同。实际上我没有领会你的意思。你的意思是&p显示指针本身的地址吗?但s数组不是这样的。s和s返回相同的地址。为什么?因为s不是指针,它是数组。当你说“s”时,它指向t数组的基址,就像是说&sman,我有点忘了这一切。我精通这些东西,但已经有一段时间我对C++@Umer一无所知:如果s
是一个数组,比如说,类型int[10]
,如果您尝试打印它,它将自动转换为指向其第一个元素的指针,该元素的类型为int*
。&p
的类型为int(*)[10]
。从类型中可以看出,&p
指向整个数组,而不仅仅是第一个元素。但是,由于数组及其第一个元素在内存中的相同地址开始,因此可以获得相同的输出。我们提供了一个您可能会感兴趣的示例。
p = 0x7fffb4455d40
&p = 0x7fffb4455d40