【问题标题】:pointer function in C not workingC中的指针函数不起作用
【发布时间】:2014-02-10 13:02:11
【问题描述】:

我打算让我的指针打印值,但它只是停止工作(MinGW 没有错误报告)。 . .

    #include<stdio.h>

    void point_here(int *yolo) {
      int you = 2014;
      yolo = &you;

    }


    main () {
      int *punk = NULL;

      point_here(punk);
      printf("Punk @ %d is not dead\w/.\n", *punk);

   }

我该如何进行这项工作?为什么这不起作用?请解释。我是指针和 C 的新手,读完东西后仍然感到困惑。

【问题讨论】:

    标签: c function pointers


    【解决方案1】:

    C 是“按值调用”;函数获取调用者值的副本,而不是对它们的引用。如果您更改函数内部的参数,调用者的上下文中不会发生任何事情。

    要解决这个问题,您需要显式指针,但即使您仍然不能在函数内部拥有指向局部变量的指针,但在该函数运行之后仍然存在。

    【讨论】:

    • 但是即使你仍然不能在函数内部有一个指向局部变量的指针,在该函数运行之后仍然存在。先生,请原谅?
    • @user3203014 他的意思是变量you在point_here返回后基本消失了。
    【解决方案2】:

    您将NULL 作为参数传递给实际上没有任何作用的函数。然后你尝试取消引用那个非法的 NULL 指针。

    【讨论】:

      【解决方案3】:

      您的代码的这个修改版本运行良好:

      #include <stdio.h>
      
      void point_here(int *yolo) {
        *yolo = 2014;
      }
      
      int main () {
        int value = 0;
        int *punk = &value;
        point_here(punk);
        printf("Punk @ %d is not dead\w/.\n", *punk);
        return 0;
      }
      

      正如其他人所说,您有以下问题:

      • 函数执行完成后,指向函数值的指针不起作用
      • 您没有将指针传递给正在传递指针值的指针。 (换句话说,您并没有编辑您认为的内容)。

      我通过传入一个已经分配的指针来解决这两个问题,然后你只需在函数中修改它。这是使用指针的一种标准方式。祝你好运!

      【讨论】:

      • 为什么我必须将*punk分配给&value(即0)而不是直接分配给NULL?那为什么要把point_here的参数改成*yolo(为什么要去掉*x)?
      • 您可以通过多种方式分配空间。最简单的方法是声明一个变量并为该变量分配内存。这就是为您创建“int 值”所做的事情。另一种方法是使用“malloc”。这行代码看起来像:int *punk = (int*)malloc(1 * sizeof(int));
      【解决方案4】:

      有两个问题。首先指针变量是按值传递的,其次变量“you”在堆栈上,一旦函数返回就会丢失。

      把你的变量改成静态的像

      static int you = 2014;
      

      并将参数更改为 **yolo;

      【讨论】:

      • 问题一:“指针变量首先是传值……”你指的是指针“*yolo”还是“*punk”?问题 2:再回答:“**yolo”这是一个双指针,对吧?为什么我需要使用双指针?是不是因为我已经把 *yolo 的值分配给了“int you”?抱歉,我还是不太明白下面的解释。
      • 问题一:指针变量punk被拷贝到一个新的变量yolo中。这就是为什么在函数调用中朋克永远不会改变的原因。问题2:双指针是指向指针变量的指针,所以指针变量变了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 2015-04-02
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多