У вас есть пара синтаксических ошибок в вашей программе, но кроме этого, основная идея в порядке. Вот синтаксические проблемы, которые я должен был исправить перед компиляцией вашей программы:
#include <iostream>
using namespace std;
struct stuff
{
int one;
int two;
};
void multiply(const stuff * pm) {
cout << pm->one * pm->two;
}
int main() {
stuff fnc;
fnc.two = 2;
fnc.one = 1;
multiply(&fnc);
}
Чтобы ответить на ваши вопросы о разнице между оператором '&' (address of) и оператором '*' (разыменование указателя), нам просто нужно подумать о типах, которые вы передаете в функцию.
Возьмите функцию умножения:
void multiply(stuff *fnc) {
...
}
В определении этой функции вы описываете что-то, что принимает указатель на структуру вещи. В этой первой строке вы не говорите, что разыменовываете этот объект, просто ожидаете указатель на объект вещи.
Теперь при вызове умножения:
stuff fnc;
multiply(&fnc);
Вы используете оператор «&» (адрес), чтобы получить указатель на объект. Поскольку функция умножения ожидает указатель, и у вас есть простой старый объект, вам нужно использовать оператор &, чтобы получить указатель для функции умножения.
Возможно, яснее будет назвать это так:
stuff fnc; //The actual object
stuff* fnc_ptr = &fnc; //A pointer to a stuff object, initialized to point at fnc created above
multiply(fnc_ptr); //Call the function with the pointer directly