скрытое меню

передача указателей в функцию

Привыкаем к синтаксису

*xxx - значение, xxx - адрес
&xxx - адрес , xxx - значение

О чем я думаю видя примерно такое объявление функции:

int i1=1;
int *i2=0xff;
int i3=5;
ffff(i1,*i2,&i3);
....
void ffff(int i1,int *i2, int &i3)
{
    *i2=1; // меняем значение , которое вне(за) функцией , на которое указывает указатель i2 (это ошибка)
    i3=2;  // меняем значение вне(за) функцией , на которое указывает ссылка i3. (это про с++ только)
    //i2=1234; // так нельзя указателю устанавливать значение (адрес)
    i2=&i1; // так указателю можно поменять значение (т.е. адрес куда он указывает) на другое значение (адрес)
    //&i3=&i1; // а ссылке нельзя менять ее значение (т.е. адрес куда она указывает)
}

Почему нельзя будет поменять значение *i2 внутри функции, которое задано изначально вне функции? В том-то и дело, что в качестве параметра *i2 мы передаем значение (0xff) , а не адрес где это значение хранится вне функции. Чтобы по переданному указателю можно было поменять значение вне функции надо использовать двойные указатели **!

Все параметры передаваемые в функцию хранятся в стеке до выхода из функции

i1 - параметр передается как значение для использования только внутри функции .
*i2 - обеспечивает связь с внешним миром функции, т.е. указывает на переменную вне функции. Значение этой переменной можно изменить из кода функции.
&int i3 - тоже , что и i2 но есть нюанс: нельзя менять само значение (адрес куда указывает ссылка).

Выводы:
Зачем нам нужна функция? - чтобы что-то вычислить и вернуть обратно результаты через входные параметры.
Смело пользуемся для этих целей параметрами при вызове функции : через них можно возвращать результаты, только учитываем нюансы.