Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 55, средняя оценка - 4.71
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
#1

Передача аргументов в функции - C++

08.06.2012, 22:18. Просмотров 7054. Ответов 24
Метки нет (Все метки)

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

Вот 3 простейших примера передачи аргументов:

а) через указатель:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
void fn(int* pintArg) { //как это понять?
    *pintArg = 10;
}
 
int main(int nNumberofArgs, char* pszArgs[]) {
    int n = 0;
    fn(&n);
    cout << n << endl;
    system("PAUSE");
}
б) по ссылке:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
void fn(int& intArg) { //как это понять?
    intArg = 10;
}
 
int main(int nNumberofArgs, char* pszArgs[]) {
    int n = 0;
    fn(n);
    cout << n << endl;
    system("PAUSE");
}
в) "простая" передача аргумента (смысла в данном случае не имеет):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
void fn(int intArg) { //как это понять?
    intArg = 10;
}
 
int main(int nNumberofArgs, char* pszArgs[]) {
    int n = 0;
    fn(n);
    cout << n << endl;
    system("PAUSE");
}
Все три случая просты и понятны. Но мне они понятны лишь на словах, т.к. передачу аргумента я представляю в абстрактном виде.

Хочется же узнать что конкретно происходит (не на словах, а кодом), когда функция получает аргумент во всех 3 случаях.

Я понимаю это так:

а)
C++
1
int* pintArg = &n // где &n - адрес переменной n
б)
C++
1
2
int& intArg = n // где n - адрес переменной n, 
//хотя это не очевидно, т.к. ожидается значение переменной n
в)
C++
1
int intArg = n // где n - значение переменной n
В общем, я слегка разжевал для себя содержимое скобочек у функций.

1) правильно ли я это сделал?
2) насчет "разжевок" под "б" и "в". Все-таки немного не понимаю, почему в случае "б" от n берется адрес, а в случае "в" - значение? Это определяет тип переменной? int& и int соответственно? Хм, они выступают в качестве операторов, что ли? Я просто как думал: есть у нас что-то, что мы собираемся послать в качестве аргумента в функцию. И это что-то при посылке и при попадании в качестве аргумента в функцию не меняется. Т.е. в данном случае что-то это n. У этой переменной есть значение - мы его и посылаем... Правда у этой переменной есть и адрес =/ Ммм, короче опять залез в кашу, которая ни для кого не каша...

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

Надеюсь на поддержку
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.06.2012, 22:18     Передача аргументов в функции
Посмотрите здесь:

Рекурсивная функция и передача аргументов функции C++
Передача аргументов в функции по ссылке C++
C++ Передача аргументов в ф-ию
Передача аргументов функции C++
передача аргументов C++
Есть функция с кучей аргументов, как её вызвать в другой функции (если половины аргументов у меня нет)? C++
В чем может быть ошибка? (передача аргументов функции) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Andrey.K
340 / 261 / 15
Регистрация: 14.11.2010
Сообщений: 480
08.06.2012, 22:33     Передача аргументов в функции #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
В пункте А) ты передаешь адрес переменной, а так как ф-ия получает адрес она может использовать операцию разыменования для доступа к значению передаваемой переменной. А дальше её использует.
В пункте Б) ты передаешь по ссылке, а это значит что ты будешь работать напрямую с переменной.
В пункте В) ты передаешь по значению, а это значит что ты будешь работать с копией передаваемого аргумента, после выхода из ф-ю значение переменной останется прежним, а когда по ссылке по изменится.
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,947
Записей в блоге: 17
08.06.2012, 22:58     Передача аргументов в функции #3
Ну как я понимаю в любом случае будут создаваться копии...
Вопрос в том только копии чего? адреса(указателя или ссыки) или самой переменной.
в первом случае можно изменить значение переменной(значение по адресу) из нутри ф-ции, а во втором нет.

По указателю и по ссылке есть смысл передавать в двух случаях:
1. Что бы изменить (возвратить) больше чем одно значение переменной.
2. Для повышения эффективности( например при передаче const T& параметров) но я как понимаю это имеет смысл когда ссылка размером меньше чем сам объект
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
08.06.2012, 23:00  [ТС]     Передача аргументов в функции #4
Andrey.K, спасибо, конечно, но я вроде написал:


Цитата Сообщение от The_Immortal Посмотреть сообщение
Все три случая просты и понятны.
Цитата Сообщение от The_Immortal Посмотреть сообщение
Хочется же узнать что конкретно происходит (не на словах, а кодом)



Цитата Сообщение от The_Immortal Посмотреть сообщение
В общем, я слегка разжевал для себя содержимое скобочек у функций.
1) правильно ли я это сделал?
?



Avazart,

Цитата Сообщение от Avazart Посмотреть сообщение
1. Что бы изменить (возвратить) больше чем одно значение переменной.
Мм... А можно примерчик какой-нибудь?

Цитата Сообщение от Avazart Посмотреть сообщение
2. Для повышения эффективности( например при передаче const T& параметров) но я как понимаю это имеет смысл когда ссылка размером меньше чем сам объект
С подобным не сталкивался, но если действительно есть такое, то тогда да - смысл использовать указатель/ссылки действительно имеется.

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
Ну как я понимаю в любом случае будут создаваться копии...
Хм... Копии? Т.е. типа в любом случае создается условная ссылка?
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,947
Записей в блоге: 17
08.06.2012, 23:11     Передача аргументов в функции #5
А можно примерчик какой-нибудь?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//using namespace std; - не использую так как там уже есть эта ф-ция
template<class T>
void swap(T &a,T &b)
{
T temp=a;
a=b;
b=temp;
}
//--------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
system("chcp 1251");
 
int a=5,b=7;
 
std::cout<<"a= "<<a<<"\tb= "<<b<<std::endl;
 
swap(a,b);
 
std::cout<<"a= "<<a<<"\tb= "<<b<<std::endl;
 
system("pause");
return 0;
}
//---------------------------------------------------------------------------
Текущая кодовая страница: 1251
a= 5 b= 7
a= 7 b= 5
Для продолжения нажмите любую клавишу . . .
Хм... Копии? Т.е. типа в любом случае создается условная ссылка?
Локальна ссылка которая существует только внутри ф-ции
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
08.06.2012, 23:12  [ТС]     Передача аргументов в функции #6
Avazart, блин... Придется попутно спросить, не дошел еще до этого


Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
template<class T>
Если по-простому то что это такое? Некий абстрактный класс, которому без разницы с чем работать? В смысле с какими типами.

Добавлено через 54 секунды
Цитата Сообщение от Avazart Посмотреть сообщение
Локальна ссылка которая существует только внутри ф-ции
Согласен. Только вот как-то... В случае "б" - получается локальная ссылка на ссылку?
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,947
Записей в блоге: 17
08.06.2012, 23:14     Передача аргументов в функции #7
Тоже что и
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void swap(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
}
//--------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
system("chcp 1251");
int a=5,b=7;
std::cout<<"a= "<<a<<"\tb= "<<b<<std::endl;
swap(a,b);
std::cout<<"a= "<<a<<"\tb= "<<b<<std::endl;
system("pause");
return 0;
}
//------------------------------------------------------
Только обобщенно для разных типов( которые потдерживаю операции которые делаются внутри ф-ции)
Andrey.K
340 / 261 / 15
Регистрация: 14.11.2010
Сообщений: 480
08.06.2012, 23:15     Передача аргументов в функции #8
Цитата Сообщение от The_Immortal Посмотреть сообщение
Avazart, блин... Придется попутно спросить, не дошел еще до этого



Если по-простому то что это такое? Некий абстрактный класс, которому без разницы с чем работать? В смысле с какими типами.
C++
1
2
3
4
5
template<class T>
T abs(T n)
{
return (n<0)?-n:n;
}
Слово template означает что сейчас будет шаблонная функция. Если у нас например есть три ф-и которые считают модуль числа, только возвращают разные типы, то удобно использовать шаблон.
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,947
Записей в блоге: 17
08.06.2012, 23:17     Передача аргументов в функции #9
Согласен. Только вот как-то... В случае "б" - получается локальная ссылка на ссылку?
Почему? Ссылка на переменную...
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
08.06.2012, 23:22  [ТС]     Передача аргументов в функции #10
Avazart,

Цитата Сообщение от Avazart Посмотреть сообщение
Ну как я понимаю в любом случае будут создаваться копии...
Цитата Сообщение от Avazart Посмотреть сообщение
Локальна ссылка которая существует только внутри ф-ции
Значит я Вас не понял. Вы что имели тут в виду?


Andrey.K,

Цитата Сообщение от Andrey.K Посмотреть сообщение
Если у нас например есть три ф-и которые считают модуль числа, только возвращают разные типы, то удобно использовать шаблон.
Не догнал Вы привели такой пример?
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,947
Записей в блоге: 17
08.06.2012, 23:34     Передача аргументов в функции #11
Пример с шаблоном - хотя это уже другая тема!!!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <class T>
T plus(const T& a,const T& b)
{
return a+b;
}
//--------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
system("chcp 1251");
int a=5,b=7;
 
std::string s1="abcd",s2="efg";
 
std::cout<< plus(a,b)   <<std::endl;
std::cout<< plus(s1,s2) <<std::endl;
 
system("pause");
return 0;
}
Код
Текущая кодовая страница: 1251
12
abcdefg
Для продолжения нажмите любую клавишу . . .
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
08.06.2012, 23:50  [ТС]     Передача аргументов в функции #12
Avazart,

Цитата Сообщение от Avazart Посмотреть сообщение
хотя это уже другая тема!!!
Согласен.

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

Вы про это?
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,947
Записей в блоге: 17
09.06.2012, 00:03     Передача аргументов в функции #13
Про это, но почему "условная" ?

Добавлено через 7 минут
"Копии указателей"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void swap(int* pa,int* pb)
{
int *ptemp=pa;
pa=pb;
pb=ptemp;
}
//--------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
system("chcp 1251");
 
int a=5,b=7;
int *pa= &a;
int *pb= &b;
 
std::cout<<"a= "<<a<<"\tb= "<<b<<std::endl;
swap(pa,pb);
std::cout<<"a= "<<a<<"\tb= "<<b<<std::endl;
 
system("pause");
return 0;
}
//---------------------------------------------------------------------------
Код
Текущая кодовая страница: 1251
a= 5    b= 7
a= 5    b= 7
Для продолжения нажмите любую клавишу . . .
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
09.06.2012, 12:38  [ТС]     Передача аргументов в функции #14
Avazart, все-таки не могу понять почему после вызова функции
Цитата Сообщение от Avazart Посмотреть сообщение
swap(pa,pb);
не меняются значения... Ведь в самой функции мы адреса, на которые указывают указатели, местами поменяли... Или это и есть "локальная замена"? А почему так?
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,947
Записей в блоге: 17
09.06.2012, 14:05     Передача аргументов в функции #15
Мы получили копии переменных содержащих адреса а и b(т.е копии указателей на а и b) а затем меняли не значения переменных а сами адреса.
Например такое бы проканало
C++
1
2
3
4
5
6
void swap(int* pa,int* pb)
{
int temp= *pa;
*pa=*pb;
*pb=temp;
}
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
09.06.2012, 18:26  [ТС]     Передача аргументов в функции #16
Avazart,

Цитата Сообщение от Avazart Посмотреть сообщение
не значения переменных а сами адреса
Да это понятно. Вот вопрос как раз в том почему после выполнения данной функции адреса не поменялись?
В самой же функции замена произошла. pa получила адрес pb и наоброт.
А после выполнения функции этой замены нет.
Почему?
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,947
Записей в блоге: 17
09.06.2012, 18:48     Передача аргументов в функции #17
после выполнения данной функции адреса не поменялись?
Поменялись, но только не в pa и pb- указателях а в их копиях...

Добавлено через 3 минуты
Т.е равносильно
C++
1
2
3
4
5
6
int*  _pa = pa;
int*  _pb = pb;
 
int *ptemp= _pa;
_pa= _pb;
_pb= ptemp;
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
09.06.2012, 19:10  [ТС]     Передача аргументов в функции #18
Avazart, хм. Ладно. А как тогда поменять там адреса оригиналов(пользуясь указателями)?


Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
2
3
4
5
6
void swap(int* pa,int* pb) 
{ 
int temp= *pa; 
*pa=*pb; 
*pb=temp; 
}
- здесь мы играемся со значениями. А как вот чисто адрес поменять?
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,947
Записей в блоге: 17
09.06.2012, 19:52     Передача аргументов в функции #19
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void swap(int* &pa,int* &pb)
{
int* ptemp= pa;
pa= pb;
pb= ptemp;
}
//--------------------------------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
system("chcp 1251");
 
int a=5,b=7;
 
int *pa= &a;
int *pb= &b;
 
std::cout<<"a= "<<a<<"\tb= "<<b<<"\t*pa= "<<*pa<<"\t*pb= "<<*pb<<std::endl;
swap(pa,pb);
std::cout<<"a= "<<a<<"\tb= "<<b<<"\t*pa= "<<*pa<<"\t*pb= "<<*pb<<std::endl;
 
system("pause");
return 0;
}
//---------------------------------------------------------------------------
Код
Текущая кодовая страница: 1251
a= 5    b= 7    *pa= 5  *pb= 7
a= 5    b= 7    *pa= 7  *pb= 5
Для продолжения нажмите любую клавишу . . .
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2012, 20:05     Передача аргументов в функции
Еще ссылки по теме:

C++ Передача аргументов функции
Передача аргументов функции C++
Передача аргументов командной строки функции main() C++
Создание динамического массива, передача аргументов функции по ссылке. Программа обрабатывает результаты матча C++
C++ Передача аргументов функции и параметры

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
rofl113
10 / 10 / 1
Регистрация: 26.02.2012
Сообщений: 36
09.06.2012, 20:05     Передача аргументов в функции #20
Все очень просто .))
если ты создаешь указатель допустим int* PtrInt - то он указывает на адрес ячейки в памяти.(причем указывая тип int ты объясняешь указателю какой объем ячейка занимает)
Используя PtrInt - ты меняешь адресс на который указывает данный указатель.
Используя *PtrInt - ты изменяешь сами данные в этой ячейке.


По ссылке. <&> очень удобная штука если не охота заморачиваться - мол функция должна что то выдавать и бла-бла-бла .))
В твоем примере видно как это обыгрывается. В функцию выдается адрес ячейки.(Узнать адресс любой ячейки можно через добавочную &) так вот отдавая в функцию адрес - ты уже внутри работаешь с той же частью памяти, а не создаешь дополнительную копию, загромождая память(как в твоем 3 примере, хотя и эта переменная будет удалена по окончанию функции).

Главное их отличие:
Указатель - указывает первоначально на адрес ячейки (без снежинки).
Ссылка - указывает на данные в ячейки (без &).

Так же забыл сказать. Указатели в основном используются для динамических переменных, а ссылки для статических.
p.s. Динамические - забирают память в процессе работы программы, а статические при его загрузке.
Yandex
Объявления
09.06.2012, 20:05     Передача аргументов в функции
Ответ Создать тему
Опции темы

Текущее время: 19:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru