如何理解函数中的指针

Posted

技术标签:

【中文标题】如何理解函数中的指针【英文标题】:How to understanding pointers in functions 【发布时间】:2015-02-04 23:26:45 【问题描述】:

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

【问题讨论】:

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函数的第一个参数是两个星星?

如何理解Cuda中的cudaMalloc函数的第一个参数是两个星星?

C++ 这句话中的“*”代表啥意思?如何理解这句话

基指针中的派生对象如何调用基函数?

C中的语法理解:指针

如何理解C中的指针星*?