首页 文章

理解指针在C中的用法

提问于
浏览
0

在我写的代码中:

int *p1=&a,**p3=&p1;

在将p3作为参数传递给函数'change'之后,p1被改变了...然后main函数打印了p1,p1取值为双指针p3(如写入int ** p3 =&p1),但它没有取一个地址(int * p1 =&a) .

这意味着p1的值将是p3的值,而不是变量'a'的地址?为什么双指针'p3'的值会被考虑?

为什么不存储指针所存储的地址(&a)的值?任何人都可以澄清这两行......

int *p1=&a;

   int **p3=&p1;

我理解双指针的概念,但需要澄清这两条线......

#include<stdio.h>   
void main()
{
    int a=2,b=3;
    int *p1=&a,*p2=&b,**p3=&p1;
    printf("p1=%d, p2=%d, p3=%d\n",p1,p2,p3);
    change(p3,p2);
    printf("p1=%d, p2=%d, p3=%d\n",p1,p2,p3);
    printf("p1=%d\n",p1);
    printf("a=%d, b=%d\n",*p1,*p2);
    }
    void change(int **x,int *z)
    {
    *x=z;
     printf("p1=%d, p2=%d\n",*x,z);
     printf("a=%d, b=%d\n",**x,*z);
}

输出:

p1=-840577016,p2=-840577012,p3=-840577008

   p1=-840577012,p2=-840577012

   a=3,b=3

   p1=-840577012,p2=-840577012,p3=-840577008

   p1=-840577012

   a=3,b=3

1 回答

  • 4

    因为您在此行中更改了 p1 . *x=z;

    为了解释一下你已经做到了这一点

    change(p3,p2)
    

    现在 p3 的地址为 p1 . 然后你只是通过赋予它别的东西来改变它 .

    那东西只不过是 b 的地址 .

    void change(int **x,int *z)
    

    x 包含 p1 的地址 . z 包含 b 的地址 .

    然后你说无论 x 的内容是什么 - 去那里写一下 z 的内容 . z 包含 b 的地址 . 所以现在我们将 p1 -s内容更改为 b 的地址 .

    ..但在主要它会忽略行int * p1 =&a后p1在函数中被改变?

    那么OP - 您认为 p1 会在这里改变吗?

    int *p1 = &a;
         p1 = &b;
    

    我们最后将 b 的地址分配给 p1 . 早先写的os被覆盖的值 .

    没有什么是被忽视的 - 程序做了任何事情 .

    另一点

    使用 %p 打印这样的指针

    printf("p1=%p, p2=%p, p3=%p\n", (void*)p1, (void*)p2, (void*)p3);
    

相关问题