2014-12-07 53 views
1

我有两个文件,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

C使用通逐值。 'change_number'中的'number'是与main中的'local_number'不同的变量。 – 2014-12-07 02:16:18

+0

[变量在函数中未被调用方看到的可能的重复?](http://stackoverflow.com/questions/27320240/variable-changed-in-function-not-seen-by-caller) – 2014-12-07 02:17:37

+0

这一行:number = &global_number;应该是:* number =&global_number I.E. number是一个指向local_number的指针。代码需要设置数值指针所指向的值 – user3629249 2014-12-07 02:39:45

回答

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); 
+0

谢谢,这确实使代码工作。我想我预计,因为指针被声明,我通过指针,我可以在函数中定义它。 – Alrekr 2014-12-07 02:48:52

+0

您的编辑完全符合我的要求。再次感谢! – Alrekr 2014-12-07 02:49:18