为什么输出不是0,1。为什么它是0,2。? #包括 空f(int*p,int*q) { p=q; *p=2; } int i=0,j=1; int main() { f&i&j); printf(“%d%d\n”,i,j); getchar(); 返回0; }

为什么输出不是0,1。为什么它是0,2。? #包括 空f(int*p,int*q) { p=q; *p=2; } int i=0,j=1; int main() { f&i&j); printf(“%d%d\n”,i,j); getchar(); 返回0; },c,function-pointers,C,Function Pointers,这个代码打印0,2,为什么它不打印0,1,因为在*p=2之后,j的值被分配到了1个右边?有谁能帮我在f里面p你正在分配q的指针值 平均值-在p=q之后,p和q都指向同一个int,即j 这就是为什么会得到0,2。“在*p=2之后,j的值被赋值1对吗?” 否,函数f()在结束处结束}大括号,并且 j在main()开始之前被分配了1的值 线路 #include<stdio.h> void f(int *p, int *q) { p = q; *p = 2; } int

这个代码打印0,2,为什么它不打印0,1,因为在*p=2之后,j的值被分配到了1个右边?有谁能帮我在
f
里面
p
你正在分配
q
指针

平均值-在
p=q之后
,p和q都指向同一个int,即
j

这就是为什么会得到0,2。

“在
*p=2
之后,
j
的值被赋值
1
对吗?”

否,函数
f()
在结束处结束
}
大括号,并且
j
main()
开始之前被分配了
1
的值

线路

#include<stdio.h>
void f(int *p, int *q)
{
    p = q;
   *p = 2;
}
    int i = 0, j = 1;
int main()
{
    f(&i, &j);
    printf("%d %d \n", i, j);
    getchar();
return 0;
}
在函数
f()
之前,也可以更进一步

“因为在
*p=2;
之后,
j
的值由
1
赋值,对吗?”

不,您似乎在这里混淆了控制流和范围方面非常困难的东西。
f
的定义放在全局变量
i
j
的定义之前

这并不意味着全局变量在函数之后赋值

int i = 0, j = 1;
是全局范围内的
i
j
(立即初始化的声明)的定义,而不是赋值

调用
f
j
2
的值是正确的,因为:

  • j
    通过引用传递给
    f
    ,其地址分配给指针参数
    q
  • 指针
    q
    的值分配给指针
    p
  • 然后取消对
    p
    的引用,它指向调用者中的
    j
    ,并将
    2
    分配给
    j
    • 以下是发生的情况:

      int i = 0, j = 1;
      

      因为在
      p=q之后
      p
      指向
      j
      但int j=1;在*p=2之后;好的,为什么值没有变为1可能是离题了:但我建议对于像这样简单的代码示例,拿支笔和纸重新画出发生的事情可能会帮助您理解。另外:我建议不要阅读标准书,但教程可能会激发你的兴趣,帮助你理解。除了其他人之外,我可以建议。它很容易理解,也能处理指针。@Akshay Hebbar如果你赋值2(*p=2;),为什么结果必须等于1?!!!我明白了!谢谢你,好的!!函数在关闭括号“}”后结束,但为什么i=0;然后呢?我不明白你的意思<代码>i初始化为
      0
      ,打印为
      0
      。它没有被修改或在程序中使用,只有你知道为什么它会出现在代码中。我明白了!非常感谢。
      statement                  i   j   p   q
      -----------------------------------------
      int i = 0, j = 1;          0   1   -   -
      f(&i, &j);                 0   1   &i  &j
      p = q;                     0   1   &j  &j
      *p = 2;                    0   2   &j  &j
      printf("%d %d \n", i, j);  0   2   -   -