Передача аргументов. Прототипы функций.
Передача аргументов по значению.
Поговорим, о том, что происходит в оперативной памяти. Аргументы, которые
указываются при определении функции, называются формальными. Это связанно
с тем что, они создаются в момент вызова функции в оперативной памяти. При
выходе из функции такие параметры будут уничтожены. Поэтому, если в другой
функции программы будут параметры с тем же именем, то конфликта не будет.
Рассмотрим, один из способов передачи аргументов:
Пример работы формальных параметров при передаче данных по значению.
#include <iostream>
using namespaсe std;
// Должна менять значения переменных местами
void Change(int One, int Two){
cout<<One<<" "<<Two<<"\n\n";// 1 2
int temp=One;
One=Two;
Two=temp;
cout<<One<<" "<<Two<<"\n\n";// 2 1
}
void main(){
int a=1,b=2;
cout<<a<<" "<<b<<"\n\n"; // 1 2
// передача по значению
Change(a,b);
cout<<a<<" "<<b<<"\n\n"; // 1 2
}
|
1. В функцию передаются не a и b, а их точные копии.
2. Все изменения происходят с копиями (One и Two), при этом сами a и b
остаются неизменными.
3. При выходе из функции временные копии уничтожаются.
Исходя из вышеописанного - пока будьте внимательны при обработке значений
внутри функции. В последствие, мы научимся решать данную проблему.
Примечание: Кстати, с массивами такого не
случается. Все изменения происходящие с массивом в функции - сохраняются при
выходе из неё.
Кое-что о массивах...
Некоторую особенность имеет использование массивов в качестве аргументов. Эта
особенность заключается в том, что имя массива преобразуется к указателю на его
первый элемент, т.е. при передаче массива происходит передача указателя. По этой
причине вызываемая функция не может отличить, относится ли передаваемый ей
указатель к началу массива или к одному единственному объекту. При передаче
одномерного массива достаточно просто указать пустые квадратные скобки:
int summa (int array[ ], int size){
int res=0;
for (int i = 0; i < size; i++)
res+ = array[i];
return res;
}
|
Если в функцию передаётся двумерный массив, то описание соответствующего
аргумента функции должно содержать количество столбцов; количество строк -
несущественно, поскольку, как говорилось ранее в функцию фактически передаётся
указатель.
int summa (int array[ ][5], int size_row, int size_col){
int res=0;
for (int i = 0; i < size_row; i++)
for (int j = 0; j < size_col; j++)
res+ = array[i][j];
return res;
}
|
Прототипы функций или второй способ объявления.
При втором способе объявления функции необходимо сообщить компилятору о том,
что функция существует. Для этого до main предоставляется имя функции, ее
аргументы, а также тип возвращаемого значения. Такую конструкцию называют
прототипом функции. Когда компилятор встречает прототип функции он точно знает о
том, что функция существует в программе после main - и, она должна там быть.
библиотеки
возвращаемое_значение имя_функции(аргументы);
void main(){
тело main;
}
возвращаемое_значение имя_функции(аргументы){
тело функции;
}
|
#include <iostream>
using namespaсe std;
// прототипы
void MyFunc();
void MyFuncNext();
void main(){
MyFunc(); //MyFunc
MyFuncNext(); //MyFuncNext
}
//описания
void MyFunc(){
cout<<"MyFunc\n";
}
void MyFuncNext(){
cout<<"MyFuncNext\n";
}
|
Считается, что такое объявление функции является наиболее красивым и
правильным.