如何理解函数中的指针
Posted
技术标签:
【中文标题】如何理解函数中的指针【英文标题】:How to understanding pointers in functions 【发布时间】:2015-02-04 23:26:45 【问题描述】:我有两个文件,main.c
和 main2.c
。我的经验告诉我,他们应该做同样的事情,但事实并非如此。
main.c
在main
例程之外声明一个全局变量。然后,在main
例程中,声明并定义一个指针以指向该全局变量。全局变量被改变,局部变量的值被打印到屏幕上。
main2.c
做同样的事情,但将局部到全局的定义和全局变量值的更改卷积到另一个函数 change_number
。
我不明白为什么这种方法会失败。 main.c
和 main2.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()。
【问题讨论】:
C 使用按值传递。number
内的 change_number
与 main 中的 local_number
是不同的变量。
Variable changed in function not seen by caller?的可能重复
这一行:number = &global_number;应该是:*number = &global_number I.E. number 是指向 local_number 的指针。代码需要设置数字指针指向的值
是的,它是重复的,但是指针和取消引用掩盖了它
@user3629249,不,它会分配一个指向整数的指针
【参考方案1】:
你永远不会在第二个程序中初始化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);
【讨论】:
谢谢,这确实使代码工作。我想我希望既然声明了指针并且我传递了指针,我可以在函数中定义它。以上是关于如何理解函数中的指针的主要内容,如果未能解决你的问题,请参考以下文章
如何理解Cuda中的cudaMalloc函数的第一个参数是两个星星?