c中变量的范围使用指针和函数

时间:2018-01-01 17:18:15

标签: c function pointers

#include<stdio.h>

int i = 10;

void func(int *q){

    q = &i;
}

int main(void){

    int i = 20;

    int *p = &i;

    printf("%d\n",*p);

    func(p);

    printf("%d",*p);

    return 0;
}

这里第二个printf语句中p的值应该是10 ......但是当我执行它时返回20怎么回事?

3 个答案:

答案 0 :(得分:2)

如果你这样做会打印10

*q = i

在被调用函数中。

在本地变量q 中的被调用函数中更改其地址与您一起的变量的内容。请勿更改局部变量q的内容。

你问我为什么?会解释......

这是调用函数并打印值时发生的情况。那么这不是一个详尽的清单,但是这指出了在这种背景下有用的关键事项。

  1. 您在i中获得了变量p的地址。

  2. 然后将其传递给被调用函数。

  3. 被叫函数现在有一个局部变量,其内容与p的内容相同。

  4. 现在,您使用全局变量i的地址更改本地变量的内容。

  5. 然后功能结束。

  6. 安息吧 - 本地变量q。它死了。

  7. 然后您再次访问*p中的main() - 这意味着您要查找p中包含的地址中的值。

  8. 你得到20

  9. 还有其他方法可以获得10吗?

    好吧有

    func(&p);
    

    然后你这样做

    void func(int **q){    
        *q = &i;
    }
    

    现在您打印*p,您将获得10

    无论 C是通过值传递,清楚地了解一些事情。即使在这里,q也是一个局部变量。但现在我们的地址为p main()q。因此,当您编写*q=&i时,您基本上会从p转到main()的地址,然后在那里写下全局变量i的地址。然后你回来了。 q再次丢失。然后打印 - 当您更改为原始变量(p)时,其中的内容为10

    代码-1

    func(p);
    

    然后在func()

    void func(int *q){
        *q = i;
    }
    

    代码-2

    func(&p);
    

    然后在func()

    void func(int **q){
        *q = &i;
    }
    

答案 1 :(得分:2)

下面

q = &i

您正在设置q的值,这是一个局部变量。更改它 not 更改传递给func()的变量的值。

要对printf()打印10进行第二次调用,您需要写入q指向的位置。

  *q = i;

q指向内部i,这种方式设置为10

答案 2 :(得分:0)

  

这里第二个printf语句中p的值应该是10(已更改)...但是当我执行它时返回20(与原始相同)。
  怎么样和为什么?

调用q时,void func(int *q)中的

pfunc(p);副本

void func(int *q){
    q = &i;
}

int main(void){
    ...
    func(p);
    ...
}

q = &i;内的更改void func(int *q)不会影响p中的main()