理解指针在C中的用法

时间:2017-12-15 15:58:49

标签: c pointers

在我写的代码中:

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

将p3作为参数传递给函数'change'后,p1得到    改变了...然后主函数打印了p1,p1取值    在双指针p3(如写入int ** p3 =& p1),但它不接地址    a(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 个答案:

答案 0 :(得分: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);