Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2009, 10:01   #1
fs444
Форумчанин
 
Регистрация: 18.08.2009
Сообщений: 289
По умолчанию Поясните передачу значений по указателям

Есть код
Код:
void fn(int* pintArg)
{
 *pintArg=10;
}
 
void parent(void)
{
 int n=0;
 fn(&n); // так передается адрес n, теперь n равно 10
}
Зачем нужны звездочки в fn()? Чем отличаются варианты
Код:
void fn(int* pintArg)
{
 *pintArg=10;
}
и
Код:
void fn(int pintArg)
{
 pintArg=10;
}
fs444 вне форума Ответить с цитированием
Старый 29.10.2009, 10:12   #2
Дырдин
Пользователь
 
Аватар для Дырдин
 
Регистрация: 26.09.2009
Сообщений: 81
По умолчанию

Звездочки - указатели на переменную pintArg
Дырдин вне форума Ответить с цитированием
Старый 29.10.2009, 12:17   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Код:
void fn(int* pintArg) // в качестве параметра функция принимает указатель на переменную, а не значение переменной
{
    *pintArg = 10; // * в данном случае оператор разыменования, он говорит, что 10 надо положить не в pintArg, а
                        // в переменную, которая находится по адресу, который хранится в pintArg.
}
Код:
void fn(int pintArg) // в качестве параметра принимает значение типа int
{
    pintArg = 10;     // переменной pintArg присвоить 10.
}
Код:
void parent()
{
    int n = 0;

    fn(n);  // передаётся число 0.
    fn(&n); // передаётся адрес(какой-нибудь вроде 0x34782390, в принципе не суть важно, всякий раз разный будет)
}
Переменные, такие как аргументы функции и переменные, объявленные внутри функции(локальные переменные), создаются, скажем так, в контексте функции. То есть они существуют только для этой функции и только до тех пор, пока функция выполняется, как только она возвращает управление эти переменные уничтожаются. То есть, если Вы передаёте 0 в функцию, которая принимает в качестве параметра значение типа int, то в этой функции создаётся переменная, которая принимает это значение(в данном случае 0). Ей можно присвоить другое значение, но опять же ,присвоение будет именно для этой переменной функции, которая будет уничтожена при выходе из функции.
Если есть желание изменить переменную, объявленную в контексте другой функции, или созданную в куче(или ещё где), то в функцию нужно передавать адрес переменной. Объявляем функцию, как void fn(int* arg);. int* - тип, который называется указатель. Указатели содержат адреса переменных. Если относительно указателя применить оператор разыменования(*), то это говорит компилятору, что нужно класть значение не в эту переменную(указатель), а в переменную, которая находится по адресу, содержащемуся в этом указателе.
Как всё происходит: В контексте функции создаётся переменная, она принимает значение - переданный адрес некой другой переменной, мы разыменовываем и кладём значение 10 по этому адресу, затем переменная с адресом(указатель) при выходе из функции уничтожается, но та переменная, на которую указатель указывал, теперь имеет значение 10
netrino вне форума Ответить с цитированием
Старый 30.10.2009, 09:29   #4
fs444
Форумчанин
 
Регистрация: 18.08.2009
Сообщений: 289
По умолчанию

То есть в int* звездочка - это оператор разыменования?
fs444 вне форума Ответить с цитированием
Старый 30.10.2009, 10:05   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если он в выражении стоит то да.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.10.2009, 10:38   #6
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

в функциях с++ чтобы аргумент передаваемый функции менялся, нужно передавать его по ссылке &n. В Си функциях аргументы могут меняться, там не надо ставить &. Используя указатель ты тем самым загружаешь в функцию адрес по которой хранится значение, *printArg = 10 значит и присвоить ему новое значение 10( разыменование указателя). В с++ с переменными так не выйдет
NiCola999 вне форума Ответить с цитированием
Старый 30.10.2009, 10:52   #7
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

int* a; - объявляем переменную типа указатель на int, т.е. здесь * - часть имени типа. Если имени типа нет, а звездочка стоит перед именем переменной, то она относится к этой переменной и является уже оператором разыменовывания:
int b = *a;
переменной типа int присваиваем значения, хранящееся по адресу, указанном в переменной a.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как организовать передачу файла в несколько секций... ikot Работа с сетью в Delphi 1 31.05.2009 09:04
Поясните ООП sodd Общие вопросы Delphi 1 23.02.2009 14:14
Осуществить передачу с клавы в объекты в программе с++ Барби Фриланс 1 23.12.2008 11:17
Как осуществить передачу и прием пакета c клиента на сервер? IIpopoK Работа с сетью в Delphi 6 07.12.2008 14:10