Главная » Статьи » Програмування » C [ Добавить статью ]

RUS Уроки по программированию на языке С (Передача аргументов. Прототипы функций.)

Передача аргументов. Прототипы функций.

Передача аргументов по значению.

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

Пример работы формальных параметров при передаче данных по значению.

#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";
}

Считается, что такое объявление функции является наиболее красивым и правильным.


Категория: C | Добавил: DEN-SHP (05.11.2012)
Просмотров: 743 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]