Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;指针赋值_C++_Pointers - Fatal编程技术网

C++ C++;指针赋值

C++ C++;指针赋值,c++,pointers,C++,Pointers,为什么90是y和q的输出值?我只是做p=q。为什么q的值会改变 int main() { int x; int y; int *p = &x; int *q = &y; x = 35; y = 46; p = q; *p = 90; cout << x << " " << y << endl; cout << *p <<

为什么
90
y
q
的输出值?我只是做
p=q
。为什么
q
的值会改变

int main() 
{

    int x;
    int y;
    int *p = &x;
    int *q = &y;

    x = 35;
    y = 46;

    p = q;

    *p = 90;

    cout << x << " " << y << endl;
    cout << *p << " " << *q << endl;
    cout << "Address of p = " << p << endl;
    cout << "Address of q = " << q << endl;

    return 0;
}

因为
q
y
的地址。在
p=q
之后,p也成为
y
的地址。这就是为什么
p
q
使用
cout
打印时打印相同的地址

换句话说,
p
q
都指向相同的变量
y
。因此,如果您更改
y
*p
*q
中任何一个的值,那么所有这些值都将发生更改,因为它们都是相同的

q的值没有改变,
q
仍然指向
y
。然而,
p
p=q
之后也指向
y
,因此
*p
本质上是
y
,并且
*p=90
分配给
y


请注意,
cout我想与大家分享一个我刚开始学习指针如何工作时使用的通用技术。如果你把它应用到你的问题上,你会发现答案一目了然

拿一大张图表纸,纵向地放在你面前的桌子上。这是你电脑的内存。每个框代表一个字节。选择一行,并将数字“100”放在最左侧框的下方。这是内存的“最低地址”。(我选择100作为不是0的任意数字,您可以选择另一个。)按从左到右的升序为方框编号

+---+---+---+---+---+-- | | | | | | ... +---+---+---+---+---+-- 100 101 102 103 104 ... x y p q +---+---+---+---+---+-- | 35| 90|101|101| | ... +---+---+---+---+---+-- 100 101 102 103 104 ...
现在什么是
*p
?什么是
*q

设置
p=q
时,它们都引用相同的内存位置。因此,如果您更改
p
指向的值,它也将更改
q
指向的值,即
y
的地址。因此,
y
*p
*q
的输出是相同的。

在执行'p=q;'语句,两个指针指向同一个变量“y”。所以当执行“*p=90;”时,变量“y”的值已更改。

首先将p定义为指向x的指针。然后将q定义为指向y的指针。 然后,你写了p=q,现在,p和q都指向y

改变*p意味着改变y。然后通过行*p=90将90赋值给y

现在,你有了这个:

  • y:90
  • p指向y
  • q指向y
  • *p:90
  • *q:90
即p点到x(35)和q点到y(46)

现在p指向y(46)

现在p(aka y)=90的内容

现在x=35,y=90,p和q指向y

cout << x << " " << y << endl;

cout好的,让我们在每一步之后看看它:

int x;
int y;
现在我们有两个变量
x
y

int *p = &x;
int *q = &y;
*p = 90;
还有另外两个变量,指针
p
,指向变量
x
并包含其地址;指针
q
指向变量
y
并包含其地址:

x = 35;
y = 46;
在这里,您可以为变量赋值,这一点很清楚:

p = q;
现在您将存储在
q
中的地址分配给变量
p
,因此这两个变量都指向
q
中的地址
y
的地址是什么:

int *p = &x;
int *q = &y;
*p = 90;
在这里,您取消引用
p
,这是
p
中地址上的变量,它是
y
,并将值
90
分配给变量
y

请参见说明:

int main()
{
int x;
int y;
int *p = &x;
int *q = &y;

x = 35;
y = 46;

p = q;      // at this point p is now pointing to the same memory address 
            // as q, both of them are pointing to the memory allocated to y

*p = 90;    // this will also change the values in *q and y 

cout << x << " " << y << endl;
cout << *p << " " << *q << endl;
cout << "Address of p = " << p << endl;
cout << "Address of q = " << q << endl;

return 0;
}
intmain()
{
int x;
int-y;
int*p=&x;
int*q=&y;
x=35;
y=46;
p=q;//此时p指向同一内存地址
//作为q,它们都指向分配给y的内存
*p=90;//这也会改变*q和y中的值

首先让我解释一下你的流程。你把x的引用放在*p中,然后把y的引用放在*q中,然后你把值都赋给x和y。现在你的缺陷从这里开始,假设x的地址是abc,y是xyz,在你的示例上下文中,你把q赋给p意味着q的值是xyz,现在p和q都指向xyz,只要你把值90赋给address xyz所以它在q和p上都打印了90,这是一个非常优雅的答案。当我学习C/C++时,我的朋友给了我一个提示,让我把*p称为“p的内容”,这之后就变得非常清楚了。只是为了确认一下,
*p==90
*q==90
?@BenR是的。p==q so*p==q。 x y p q +---+---+---+---+---+-- | 35| 46|101|101| | ... +---+---+---+---+---+-- 100 101 102 103 104 ...
*p = 90;
x y p q +---+---+---+---+---+-- | 35| 90|101|101| | ... +---+---+---+---+---+-- 100 101 102 103 104 ...
int x;int y;int *p = &x;int *q = &y;x = 35;y = 46;
p = q;
*p = 90;
cout << x << " " << y << endl;
cout << *p << " " << *q << endl;
cout << "Address of p = " << p << endl;cout << "Address of q = " << q << endl;
int x;
int y;
int *p = &x;
int *q = &y;
x = 35;
y = 46;
p = q;
*p = 90;
int main()
{
int x;
int y;
int *p = &x;
int *q = &y;

x = 35;
y = 46;

p = q;      // at this point p is now pointing to the same memory address 
            // as q, both of them are pointing to the memory allocated to y

*p = 90;    // this will also change the values in *q and y 

cout << x << " " << y << endl;
cout << *p << " " << *q << endl;
cout << "Address of p = " << p << endl;
cout << "Address of q = " << q << endl;

return 0;
}