我遇到一个问题,理解这段代码是指向另一个指针的指针。我需要找到输出,但我对 P 等于 Q 的行感到困惑,这是什么意思?这是代码:
int x;
int y;
int *p = &x;
int *q = &y;
x = 35; y = 46;
p = q;
*p = 78;
cout << x << " " << y << endl;
cout << *p << " " << *q << endl;
谢谢
行
p = q
将存储在p
(指针(的值设置为等于存储在q
(也是指针(中的值。指针将地址存储为其值,因此该行现在p
和q
存储相同的地址。
所以基本上你正在更改p
以指向整数y
的地址。
从那里继续,下一行:
*p = 78;
转到存储在p
中的地址并将值更改为78
。
意味着两个指针现在都指向y值
p = q;
让我们逐行浏览: 首先我们声明整数x
,y
,
int x;
int y;
然后我们创建指针*p
,并给它分配x
地址,方法是说:
int *p = &x;
然后我们创建指针*q
,并给它分配y
地址,方法是说:
int *q = &y;
您必须知道指针指向地址,&
运算符返回操作数的地址。
然后我们分配x = 35; y = 46;
.您需要知道p
仍然指向x
,q
仍然指向y
。
然后排p = q;
,我们说指针p
将指向q
指向的地址(这是y
的地址(
在第*p = 78
行中,我们正在取消引用指针p
并为其分配 78。什么意思?好吧,请记住指针p
指向y
,因此在本例中我们将y
的值更改为 78。
现在x
35岁,y
78岁。指针p
和q
仍然指向y
的地址。
第cout << x << " " << y << endl
行将打印35 78
,
第cout << *p << " " << *q << endl
行将打印78 78
,因为请记住指针p
和q
指向y
,取消引用这些指针将显示y
的值为 78。
我对 Q 等于 P 的行感到困惑,这是什么意思?
我猜你的意思是"p = q;"这一行
编写代码来命令编译器提供更多信息是微不足道的。
以下 cout 的报告既有地址信息,也有值信息。
#include <iostream>
using std::cout, std::cerr, std::endl, std::hex, std::dec, std::cin, std::flush; // c++17
#include <iomanip>
using std::setw, std::setfill;
#include <string>
using std::string, std::to_string;
#include <sstream>
using std::stringstream;
int main(int , char** )
{
int retVal = 0;
int x;
int y;
int *p = &x; // p points to x
int *q = &y; // q points to y
x = 35; y = 46; // assignment
// addresses of ---------------------vv----------------vv
cout << "n &x &y: " << setw(16) << &x << setw(16) << &y
// ---------------------vv----------------vv--values of
<< "n x y: " << setw(16) << x << setw(16) << y << endl;
// addresses of ---------------------vv----------------vv
cout << "n &p &q: " << setw(16) << &p << setw(16) << &q
// ---------------------vv----------------vv--values of pointers
<< "n p q: " << setw(16) << p << setw(16) << q
// ---------------------vv----------------vv--values of what pointers point at
<< "n *p *q: " << setw(16) << *p << setw(16) << *q << endl;
cout << "n p = q; ... now p and q both point to y";
p = q;
cout << "n *p = 78 ... now y is 78" << flush;
*p = 78;
cout << "n and x is unchanged: " << x << endl;
// addresses of ---------------------vv----------------vv
cout << "n &x &y: " << setw(16) << &x << setw(16) << &y
// ---------------------vv----------------vv--values of
<< "n x y: " << setw(16) << x << setw(16) << y << endl;
cout << "n and both p and q point to y" ;
// addresses of ---------------------vv----------------vv
cout << "n &p &q: " << setw(16) << &p << setw(16) << &q
// ---------------------vv----------------vv--values of pointers
<< "n p q: " << setw(16) << p << setw(16) << q
// ---------------------vv----------------vv--values of what pointers point at
<< "n *p *q: " << setw(16) << *p << setw(16) << *q << endl;
// after assignment, p & q -----------^-----------------^--- point to the same address
return retVal;
}
典型输出:
&x &y: 0x7ffeefe1e9bc 0x7ffeefe1e9c0
x y: 35 46
&p &q: 0x7ffeefe1e9c8 0x7ffeefe1e9d0
p q: 0x7ffeefe1e9bc 0x7ffeefe1e9c0
*p *q: 35 46
p = q; ... now p and q both point to y
*p = 78 ... now y is 78
and x is unchanged: 35
&x &y: 0x7ffeefe1e9bc 0x7ffeefe1e9c0
x y: 35 78
and both p and q point to y
&p &q: 0x7ffeefe1e9c8 0x7ffeefe1e9d0
p q: 0x7ffeefe1e9c0 0x7ffeefe1e9c0
*p *q: 78 78
按照编码,这些地址都在自动变量中...未使用动态内存。