如何理解函数中的指针

时间:2014-12-07 02:11:17

标签: c function pointers pass-by-value

我有两个文件,main.cmain2.c。我的经验告诉我他们应该做同样的事情,但事实并非如此。

main.cmain例程之外声明一个全局变量。然后,在main例程中,声明并定义指针以指向该全局变量。全局变量已更改,并且局部变量的值将打印到屏幕。

main2.c做同样的事情,但是将局部到全局的定义和全局变量值的变化卷入另一个函数change_number

我无法理解为什么这种方法失败了。 main.cmain2.c是几个小时的错误修复,文档和教程阅读的结果,显然,在这里阅读SO。

我对指针的理解是我称之为基本的:它指向一个内存位置。在常规变量的情况下,指针将指向该变量的内存位置。几个指针可以指向相同的内存位置,但是一个指针不能指向多个位置。

在C中没有传递引用这样的东西,但据我所知,这不是通过引用传递的,因为所有变量和指针都在函数外部定义。请赐教。

//File: main.c
#include <stdio.h>
#include <stdlib.h>

int global_number;

int main() {
    int *local_number;
    local_number = &global_number;
    global_number = 9;
    printf("local_number = %d\n", *local_number);

    return 0;
}

输出:“local_number = 9”。这是预期的结果。

//File: main2.c
#include <stdio.h>
#include <stdlib.h>

int global_number;

void change_number(int *number) {
    number = &global_number;
    global_number = 9;
}

int main() {
    int *local_number;
    change_number(local_number);
    printf("local_number = %d\n", *local_number);

    return 0;
}

输出:“分段故障”。这显然不是故意的。代码运行正常,直到printf()。

1 个答案:

答案 0 :(得分:3)

你永远不会在第二个程序中初始化local_number。它没有指向任何地方,并且在访问时会崩溃。尝试

int *local_number = &global_number;

那么值应该改变

要让change_number也初始化local_number,传递local_number的地址并更改指向指针

void change_number( int **number ) {
    *number = &global_number;
    global_number = 9;
}

...
int *local_number;
change_number(&local_number);