"&" оператор означает "адрес", так что ваша функция 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.
Я ценю быстрый ответ. –