2014-02-10 13 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

_but даже вы все еще не можете иметь указатель на локальную переменную внутри функции, которая сохраняется за пределами этой функции. Сэр pardon? – 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 value». Другой способ - использовать «malloc». Эта строка кода выглядит так: 'int * punk = (int *) malloc (1 * sizeof (int));' –

Смежные вопросы