2013-10-26 2 views

ответ

2

Изменить этот код:

function1(int *hello) { 
    function2(&hello); 
} 

к:

function1(int *hello) { 
    function2(hello); // <-- no "&" in this call! 
} 

Тогда вы можете сделать это:

function2(int *hello) { 
    *hello = 123;  // <-- dereference pointer hello 
} 
+0

Я ценю быстрый ответ. –

2

Вы делаете ошибку в function1 где ваш пропуск по адресу указателя на ваш int hello в основной функции. вы передаете указатель forwart на function2 и разыгрываете его там.

function2(int *hello) { 
    *hello = 123 ; 
} 

function1(int *hello) { 
    function2(hello); //pass the pointer on to function2 
} 

int main(void) { 
    int hello = 0; 

    function1(&hello); 

return 0 ; 
} 

Вы также неправильно объявляете свою основную функцию. Он должен быть объявлен как int main() с оператором return.

2

Как Mvp ответit is correct answer but i am here just explaining something, which will help you to understand, why your code is not working.


Прежде всего позвольте мне объяснить оператору вы использовали
1] Ampersand Оператор (&)
This operator helps you to get reference/address of variable
Как только мы объявляем переменную, объем памяти необходимо назначить для него в определенном месте в памяти. Поскольку мы обычно не принимаем активного решения о точном расположении переменной в операционной системе во время выполнения, но какое-то время нам нужно знать адрес нашей переменной, как здесь. You want to know the address of variable to assign it's address to pointer Адрес, который находит переменную с памятью, является тем, что мы называем reference этой переменной. Мы можем использовать ссылочную переменную.

разыменовывают Оператор (*)
Как мы знаем, что указатель является переменной, которая будет хранить этот адрес другого variale, используя указатель можно непосредственно получить доступ к значению, сохраненному в переменной, на которую он указывает. To do this we simply have to precede the pointer's identifier with an asterisk (*), which acts as deference operator and that can be literally translated to value pointed by


Теперь вернемся к коду

function2(int *hello) { // Here you create function that accept address of variable (You will get address of hello pointer 101 NOT 100 of variable assign in your MAIN) 
    //something 
} 

function1(int *hello) {// Here you create function that accept address of variable (Here it will get address of hello which is 100) 

    function2(&hello); // Here you again pass address of your pointer hello (Which may be 101) [BAD] 

} 

main { 
int hello = 0; // Let say it's address is 100 

function1(&hello); // Here you pass address of your variable(which is 100) [GOOD] 

} 


Раствор как предложено

function2(int *hello) { 
    //Change your value here 
    *hello = 123; 
} 

function1(int *hello) { 

    function2(hello); // It will pass 100 (address of your variable hello assign in MAIN 

} 

main { 
int hello = 0; 

function1(&hello); 

} 
+1

Хороший ответ, замените ссылку по адресу или амперсанду, например. 'Reference Operator (&)' должен быть 'Ampersand Operator (&)' –

+0

Спасибо Ответ отредактирован – Jageen

+0

Не так как в C нет ссылочной переменной (но он находится на C++) Я всегда предлагаю использовать адрес для адреса и ссылки для справки , –

0

"&" оператор означает "адрес", так что ваша функция 1 является пытаясь вызвать функцию2 с адресом «привет», а не содержать адрес привет.

В ответ на другой вопрос I said this:

Указатели являются переменными, которые хранят множество, как и любой другой, но потому, что компилятору это указатель, компилятор позволяет использовать это значение в качестве адрес вещей в памяти, а язык обеспечивает «разыменование» как способ сказать «значение AT в адресе, которое эта переменная описывает».

Представьте, что вы едете в аэропорт, чтобы ловить полет. Вы хватаете записку и записываете свой номер рейса, и вы берете второе сообщение с собой за ваши ворота.

Первое сообщение - это указатель «Полет *», а второй - «ворота», но прямо сейчас указатель ворот * пуст.

Когда вы добираетесь до аэропорта, вы просматриваете свой полет на борту и записываете номер ворот. "3A". Теперь ваши ворота * post-it действительны.

Но само по себе это не ваши ворота, а просто указывает на это: вам все равно придется «разыгрывать» записку, чтобы добраться до вашего полета, то есть пройти через аэропорт к воротам 3A:)

Когда вы позвонили function1, вы указали адрес переменной в главном. Все, что вам нужно сделать, это переслать его в функцию2. То, что ваш код пытался сделать, - это отметить, что сообщение - это не номер ворот, а не просто взгляд на заметку.

Решение

#include <stdio.h> 

void function1(int*); // so the compiler knows what the function looks like. 
void function2(int*); 

int main() { 
    int varInMain = 0; // lets call it something distinct 
    printf("varInMain starts with %d, it's location in memory is %p.\n", 
      varInMain, &varInMain); 

    function1(&varInMain); 

    printf("varInMain is %d after calling function1.\n", varInMain); 

    return 0; 
} 

void function1(int* func1ptr) { 
    printf("function1: func1ptr points to memory location %p, which contains %d.\n", 
      func1ptr, *func1ptr); 
    *func1ptr = 1010; 
    function2(func1ptr); 
} 

void function2(int* func2ptr) { 
    printf("function2: func2ptr points to memory location %p, which contains %d.\n", 
      func2ptr, *func2ptr); 
    *func2ptr = 123; 
} 

Вы можете увидеть live demo of this code on ideone.com here.

Выход выглядит следующим образом:

varInMain starts with 0, it's location in memory is 0xbfef2fdc. 
function1: func1ptr points to memory location 0xbfef2fdc, which contains 0. 
function2: func2ptr points to memory location 0xbfef2fdc, which contains 1010. 
varInMain is 123 after calling function1. 
Смежные вопросы