2014-02-10 112 views
0

我打算讓我的指針打印值,但它只是停止工作(沒有來自MinGW的錯誤報告)。 。 。C中的指針函數不工作

#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,在閱讀內容後仍然感到困惑。

回答

0

C是「按價值調用」;函數獲取調用者值的副本,而不是對它們的引用。如果您在函數內部更改參數,則調用者的上下文中不會發生任何事情。

要解決這一點,你需要明確的指針,但即使你仍然不能有一個指針指向一個局部變量的函數內持續超過該功能的運行。

+0

_但即使你仍然不能有一個函數內部的局部變量的指針,除了該函數的運行之外,仍然存在._先生赦免? – user3203014

+0

@ user3203014他意味着變量'you'在'point_here'返回後基本消失了。 –

0

你正在將NULL作爲參數傳遞給一個函數,該函數實際上並不是什麼都不是。然後你嘗試解引用那個非法的NULL指針。

-1

有2個問題。首先指針變量是按值傳遞的,第二個變量「你」在堆棧上,一旦函數返回就會丟失。

變化的變量,你要像靜態

static int you = 2014; 

,改變參數** YOLO;

+0

問題1:「首先指針變量是按值傳遞的......」 你是指「* yolo」還是「* punk?」指針? 問題2:重新:「** yolo」,這是一個雙指針,對嗎?爲什麼我需要使用雙指針?是否因爲我已經將* yolo的值分配給「int you」? 對不起,我還是不太清楚下面的解釋。 – user3203014

+0

問題1:指針變量punk被複制到yolo的新變量中。這就是爲什麼朋克在函數調用中從不改變的原因。 問題2:雙指針指向指針變量的指針,所以指針變量被改變。 –

0

代碼的這個修改後的版本效果很好:

#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; 
} 

正如其他人所說,你有以下問題:

  • 指向一個函數值的函數完成後不工作執行
  • 您沒有將指針傳遞給正在傳遞指針值的指針。 (換句話說,你並沒有編輯你認爲的你)。

我通過傳入已經分配的指針來解決這兩個問題,然後在函數中修改它。這是使用指針的一種標準方式。祝你好運!

+0

爲什麼我必須分配_ * punk_到_&VALUE_(即0),而不僅僅是直接分配爲NULL? 那麼爲什麼要改變_point_here_到_ * yolo_的參數(爲什麼刪除_ * X_)? – user3203014

+0

您可以通過多種方式分配空間。最簡單的方法是聲明一個變量併爲該變量分配內存。那是什麼創造「int值」爲您做。另一種方法是使用「malloc」。這行代碼如下所示:'int * punk =(int *)malloc(1 * sizeof(int));' –