【问题标题】:Understanding of pointers an usage in C了解指针在 C 中的用法
【发布时间】:2017-12-15 15:58:48
【问题描述】:

在我写的代码中:

   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

【问题讨论】:

  • 输出“a=3,b=3”不可能由语句“printf("a=%d, b=%d\n",*p1,*p2 );”,因为后者包含一个空格,而前者没有。虽然在这种情况下这不会导致问题,但在显示输出时,请复制并粘贴准确的输出,以避免转录错误。
  • %d 不适合打印指针 - 你想要 %p
  • @ChrisTurner.:在您发表评论之前已在答案中编辑
  • p1=1244434040, p2=1244434044, p3=1244434048 p1=1244434044, p2=1244434044 a=3, b=3 p1=1244434044, p2=1244434040, p2=124443444443=12444344 , b=3
  • 指针只不过是一个变量,它存储了其他东西的地址作为它的值。虽然您可以继续向任何指针添加间接级别作为教育练习,但这不是预期的目的。多级间接是一种工具,它可以索引集合中的各个指针,而不是简单地不断取消引用指针以获取单个地址处的值。练习很好,只要注意指向类型指针的指针(例如双指针)通常用于访问指针集合中的 1。

标签: c pointers


【解决方案1】:

因为您在这一行更改了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的地址。

..但在函数中p1 被更改后,它主要会忽略int *p1=&amp;a 行吗??

对于 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);

【讨论】:

  • 是的,我已经在函数中更改了它...但是在函数中更改 p1 后,它主要会忽略 int *p1=&a 行吗??
  • @vyshnavivanjari - “忽略”是什么意思?没有什么被忽略 - 正如你所说,你已经改变了它。
  • @coderredoc ...了解..它被操作系统覆盖...非常感谢
猜你喜欢
  • 2015-09-24
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 2020-11-02
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多