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

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

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

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

08.06.2012, 22:18. Просмотров 7461. Ответов 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. У этой переменной есть значение - мы его и посылаем... Правда у этой переменной есть и адрес =/ Ммм, короче опять залез в кашу, которая ни для кого не каша...

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

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

Передача аргументов функции - C++
Как передать функции переменную неизвестного типа?

Передача аргументов функции - C++
В книге Стенли Липпмана C++ Primer дошел до программы, которая выполняет замену слов в одном файле, которые указаны в другом. Например, ...

Передача аргументов функции - C++
Всем привет. Писал код не зная, правильно ли это. В общем застрял на составлении прототипов функции и функции мэин. И ещё, можно ли так как...

Передача аргументов функции и параметры - C++
Здравствуйте, никак не могу написать правильно параметры функции prntls string permissions(struct stat &amp;, string &amp;); string...

Передача аргументов в функции по ссылке - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;iomanip&gt; #include &lt;math.h&gt; using namespace std; const...

Рекурсивная функция и передача аргументов функции - C++
Помогите пожалуйста!!!!! Пропустила занятие, а разобраться не получается!!!!!!!!А нужно на завтра!!!! Написать рекурсивную функцию...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
The_Immortal
1552 / 488 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
09.06.2012, 18:26  [ТС] #16
Avazart,

Цитата Сообщение от Avazart Посмотреть сообщение
не значения переменных а сами адреса
Да это понятно. Вот вопрос как раз в том почему после выполнения данной функции адреса не поменялись?
В самой же функции замена произошла. pa получила адрес pb и наоброт.
А после выполнения функции этой замены нет.
Почему?
0
Avazart
Эксперт С++
7188 / 5362 / 280
Регистрация: 10.12.2010
Сообщений: 23,664
Записей в блоге: 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;
1
The_Immortal
1552 / 488 / 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; 
}
- здесь мы играемся со значениями. А как вот чисто адрес поменять?
0
Avazart
Эксперт С++
7188 / 5362 / 280
Регистрация: 10.12.2010
Сообщений: 23,664
Записей в блоге: 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
Для продолжения нажмите любую клавишу . . .
1
rofl113
10 / 10 / 1
Регистрация: 26.02.2012
Сообщений: 36
09.06.2012, 20:05 #20
Все очень просто .))
если ты создаешь указатель допустим int* PtrInt - то он указывает на адрес ячейки в памяти.(причем указывая тип int ты объясняешь указателю какой объем ячейка занимает)
Используя PtrInt - ты меняешь адресс на который указывает данный указатель.
Используя *PtrInt - ты изменяешь сами данные в этой ячейке.


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

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

Так же забыл сказать. Указатели в основном используются для динамических переменных, а ссылки для статических.
p.s. Динамические - забирают память в процессе работы программы, а статические при его загрузке.
2
The_Immortal
1552 / 488 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
09.06.2012, 20:14  [ТС] #21
Avazart, а... То есть тут Вы передаете адреса самих указателей и уже по этим адресам меняетесь адресами, на которые они указывают. Верно?
0
Avazart
Эксперт С++
7188 / 5362 / 280
Регистрация: 10.12.2010
Сообщений: 23,664
Записей в блоге: 17
09.06.2012, 20:26 #22
Ну да...
0
The_Immortal
1552 / 488 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
09.06.2012, 20:28  [ТС] #23
Avazart,
Цитата Сообщение от Avazart Посмотреть сообщение
Поменялись, но только не в pa и pb- указателях а в их копиях...
Все-таки возвращаясь к копиям... Эти копии же создаются в виде ссылок, верно? Они же имеют идентичные адреса, что и оригиналы, так?
0
Avazart
Эксперт С++
7188 / 5362 / 280
Регистрация: 10.12.2010
Сообщений: 23,664
Записей в блоге: 17
09.06.2012, 20:36 #24
так вот отдавая в функцию адрес - ты уже внутри работаешь с той же частью памяти, а не создаешь дополнительную копию, загромождая память(как в твоем 3 примере, хотя и эта переменная будет удалена по окончанию функции.
Как я понимаю ссылка как и указатель - те же переменные и при вызове ф-ции также выделяется память под них (под их временные объекты) т.е не факт что копия переменной будет весить меньше чем они и использование ссылки и указателя будет оправданным в плане эффективности.

-Это как я это понимаю

Добавлено через 1 минуту
Все-таки возвращаясь к копиям... Эти копии же создаются в виде ссылок, верно? Они же имеют идентичные адреса, что и оригиналы, так?
Содержат в себе те же адреса, но находятся по разным адресам...
1
Avazart
Эксперт С++
7188 / 5362 / 280
Регистрация: 10.12.2010
Сообщений: 23,664
Записей в блоге: 17
15.07.2012, 20:02 #25
Я ошибался под ссылку может не выделяться память, по крайней мере так пишит Дьюхэрст.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2012, 20:02
Привет! Вот еще темы с ответами:

Передача аргументов командной строки функции main() - C++
Добрый день Дана задача: Напишите программу, которая запрашивает пароль, задаваемый в команд- ной строке. Ваша программа не должна...

В чем может быть ошибка? (передача аргументов функции) - C++
Есть двумерный массив, симулирующий игровое поле (0 означают пустоту, 8 игрок) Есть некая функция, которую я хочу использовать просто для...

Создание динамического массива, передача аргументов функции по ссылке. Программа обрабатывает результаты матча - C++
Разработать программу, предназначенную для обработки информации о матчах, сыгранных футбольной командой. Количество сыгранных матчей и...

Есть функция с кучей аргументов, как её вызвать в другой функции (если половины аргументов у меня нет)? - C++
Я конечно, понимаю, что на такие вопросы отвечают &quot;почитай книжку&quot;. Я читала, честное слово:) Конкретно. Есть функция void jacobi (...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.07.2012, 20:02
Ответ Создать тему
Опции темы

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