C中的指针问题

C中的指针问题,c,pointers,C,Pointers,我有以下问题和答案: int m = 5; int n = m; int *p1 = &m; int *p2 = &n; m = 10; p2 = p1; *p2 = 7; 问题询问以下各项的价值,答案如下: m=7,n=5,*p1=7,*p2=7 这就是我所尝试的: m是值为5的整数。n是一个int,其值被分配给m的值,即5 以及p1和p2,并初始化为指向m和n的指针 然后我把m的值改为10,所以m是10,n是5 然后当我设置p2=p1时,两个指针都指向m 当我将

我有以下问题和答案:

int m = 5;

int n = m;

int *p1 = &m;

int *p2 = &n;

m = 10;

p2 = p1;

*p2 = 7;
问题询问以下各项的价值,答案如下:

m=7,n=5,*p1=7,*p2=7

这就是我所尝试的:

m是值为5的整数。n是一个int,其值被分配给m的值,即5 以及p1和p2,并初始化为指向m和n的指针

然后我把m的值改为10,所以m是10,n是5

然后当我设置p2=p1时,两个指针都指向m

当我将p2指向的变量改为7时,n变为7,因此m=10,n=7,p1和p2指向n,其值为7

因此:

m=10,n=5,*p1=7,*p2=7

我做错了什么


编辑:已求解的p1和p2都指向m。因此,*p1和*p2的值是m的值,m是7。如果更改指针指向的变量的值,指针仍将指向它。

p1和p2都指向m。因此,*p1和*p2的值是m的值,m是7。如果更改指针指向的变量的值,指针仍将指向它。

您说:当我将p2指向的变量更改为7时,n变为7

但你也会说,就在前面:当我设置p2=p1时,两个指针都指向m

我在这里看到了一个矛盾。

你说:当我把p2指向的变量改为7时,n变成了7

但你也会说,就在前面:当我设置p2=p1时,两个指针都指向m


我在这里看到一个矛盾。

你的错误在你回答的最后一行。 p2指向m的内存地址,而不是n

p2=p1表示存储在p2上的内存地址将是存储在p1中的地址,即m的内存地址


永不改变*p2=7;发生在p2=p1之后,当p2是m的内存地址时。

您的错误出现在您答案的最后一行。 p2指向m的内存地址,而不是n

p2=p1表示存储在p2上的内存地址将是存储在p1中的地址,即m的内存地址

永不改变*p2=7;发生在p2=p1之后,当p2是m的内存地址时。

的变量,表示“x是…”,指针表示“…指向x”,当取消引用时表示“(x指向的东西)”。那么操作的顺序可以说是:

  • m是5
  • n是5
  • p1指向m
  • p2指向n
  • m是10
  • p2指向m(因为p2得到p1的值)
  • (p2指向[m]的东西)是7
现在看看你的答案,看看它是否有意义。

在变量中,说“x是…”,在指针中说“…指向x”,在取消引用时说“(x指向的东西)”。那么操作的顺序可以说是:

  • m是5
  • n是5
  • p1指向m
  • p2指向n
  • m是10
  • p2指向m(因为p2得到p1的值)
  • (p2指向[m]的东西)是7

现在看看你的答案,看看它是否有意义。

好的,我希望这能给你一些启示

int *p1 = &m;
int *p2 = &n;
m = 10;
p2 = p1;
*p2 = 7;

int m = 5;

  +-----+
m |  5  |
  +-----+

int n = m; // copy value, m and n are in two diff places

  +-----+
n |  5  |
  +-----+

int *p1 = &m; // set pointer to m

        +-----+
p1 -> m |  5  |        
        +-----+

int *p2 = &n; // set pointer to n

        +-----+
p1 -> m |  5  |        
        +-----+

        +-----+
p2 -> n |  5  |        
        +-----+

m = 10

        +-----+
p1 -> m |  10 |        
        +-----+

        +-----+
p2 -> n |  5  |        
        +-----+

p2 = p1        

        +-----+
p1 -> m |  10 |        
        +-----+
       /     
p2  --+

*p2 = 7

        +-----+
p1 -> m |  7  |        
        +-----+
       /     
p2  --+

好吧,我希望这能给我们一些启示

int *p1 = &m;
int *p2 = &n;
m = 10;
p2 = p1;
*p2 = 7;

int m = 5;

  +-----+
m |  5  |
  +-----+

int n = m; // copy value, m and n are in two diff places

  +-----+
n |  5  |
  +-----+

int *p1 = &m; // set pointer to m

        +-----+
p1 -> m |  5  |        
        +-----+

int *p2 = &n; // set pointer to n

        +-----+
p1 -> m |  5  |        
        +-----+

        +-----+
p2 -> n |  5  |        
        +-----+

m = 10

        +-----+
p1 -> m |  10 |        
        +-----+

        +-----+
p2 -> n |  5  |        
        +-----+

p2 = p1        

        +-----+
p1 -> m |  10 |        
        +-----+
       /     
p2  --+

*p2 = 7

        +-----+
p1 -> m |  7  |        
        +-----+
       /     
p2  --+

嗯,好吧,那m呢?它被改成了10,为什么变成了7?@TeoZec:你不是说m而不是n吗?基本上,m和n都没有正确的值。@mouviciel是的,当然。我打错了。我真的很抱歉。我会改正的it@user3717271对不起,我的回答有错误。现在试试看。嗯,好吧,m呢?它被改成了10,为什么变成了7?@TeoZec:你不是说m而不是n吗?基本上,m和n都没有正确的值。@mouviciel是的,当然。我打错了。我真的很抱歉。我会改正的it@user3717271对不起,我的回答有错误。现在就看吧。我刚编辑完这篇文章就发布了。我想我已经修好了。很抱歉。发布这篇文章时我正在编辑它。我想我已经修好了。很抱歉。好吧,我觉得现在有道理了。当我设置p2=p1时,两个指针都指向m,因此当我将p2指向的变量更改为7时,m变为7,而n不受影响,因此m=7,n=5,p1和p2指向n,其值为7。谢谢是的,那很好。请在选票底部的标记上把答案设置为正确。好的,我认为现在有意义了。当我设置p2=p1时,两个指针都指向m,因此当我将p2指向的变量更改为7时,m变为7,而n不受影响,因此m=7,n=5,p1和p2指向n,其值为7。谢谢是的,那很好。请在选票底部的标记上将答案设置为正确。