将指针分配给另一个指针时会发生什么情况?



我遇到一个问题,理解这段代码是指向另一个指针的指针。我需要找到输出,但我对 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(也是指针(中的值。指针将地址存储为其值,因此该行现在pq存储相同的地址。

所以基本上你正在更改p以指向整数y地址


从那里继续,下一行:

*p = 78;

转到存储在p中的地址并将值更改为78

意味着两个指针现在都指向y

p = q;

让我们逐行浏览: 首先我们声明整数xy

int x;
int y;

然后我们创建指针*p,并给它分配x地址,方法是说:

int *p = &x;

然后我们创建指针*q,并给它分配y地址,方法是说:

int *q = &y;

您必须知道指针指向地址,&运算符返回操作数的地址。

然后我们分配x = 35; y = 46;.您需要知道p仍然指向xq仍然指向y

然后排p = q;我们说指针p将指向q指向的地址(这是y的地址(

在第*p = 78行中,我们正在取消引用指针p并为其分配 78。什么意思?好吧,请记住指针p指向y,因此在本例中我们将y的值更改为 78。

现在x35岁,y78岁。指针pq仍然指向y的地址。

cout << x << " " << y << endl行将打印35 78

cout << *p << " " << *q << endl行将打印78 78,因为请记住指针pq指向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

按照编码,这些地址都在自动变量中...未使用动态内存。

最新更新