Объясняя Pass by Pointer в C ++? - PullRequest
0 голосов
/ 22 октября 2019

У меня есть функция C ++, в которой у меня есть два int, цель которых - служить счетчиками, которые объявлены вне функции в моем основном коде. Моя цель состоит в том, чтобы обновить переменные счетчика с результатом выполнения функции.

Я объявил их таковыми

int cor_letters = 0;
int cor_place = 0;

и затем вызвал мою функцию как

res = compare(input, secret_word, &cor_letters, &cor_place);

Мой compare заголовок функции:

bool compare(string user_input, string secret, int * correct_letters, int * correct_place)

, а в моем коде compare, когда я получаю окончательные значения счетчиков, я обновляю их так:

correct_letters = &cor_l;
correct_place = &cor_p;

Я пришел к этому решению после тщательного изучения ошибок моего компилятора, и это, похоже, работает. Однако я не совсем понимаю, почему это работает. Сначала я беру адрес двух переменных и передаю их в функцию. Но функция принимает два указателя. Таким образом, указатели указывают на адрес переданных переменных.

До этого момента я, кажется, понимал, что происходит. Но это последние назначения, которые меня смущают - указатели (обратите внимание, это имена переменных из заголовка функции) затем обновляются до адреса временных переменных внутренней функции, которые я использую. Почему это дает мне значения?

Я - больше визуальный ученик, и указатели трудно понять, просто читая некоторый текст, так что, если вы не возражаете, составьте небольшую текстовую диаграмму для представления того, чтопроисходит, это было бы здорово. Спасибо

1 Ответ

7 голосов
/ 22 октября 2019

Я полагаю, что вы в итоге набрали

correct_letters = &cor_l;
correct_place = &cor_p;

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

Вы, вероятно,хочу сделать это

*correct_letters = cor_l;
*correct_place = cor_p;

, чтобы присвоить правильные значения переменным, которые находятся вне функции.

Краткое примечание о ссылка (&) и разыменование (*) операций.

TYPE var_a=..., var_b=...; // some variables of a chosen type
TYPE *ptr=NULL;    // a pointer on such a type, but not referencing anything yet

ptr=&var_a; // now ptr memorises the address of var_a (reference operation)

var_b=*ptr; // access the value which is stored at the address memorised
            // by ptr (dereference operation) in order to read it
            // (here, this has the same effect as   var_b=var_a;   )

*ptr=var_a+var_b; // access the value which is stored at the address memorised
                  // by ptr (dereference operation) in order to alter it
                  // (here, this has the same effect as   var_a=var_a+var_b;   )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...