Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Локальные и глобальные переменные
Переменные, которые используются внутри данной функции, называются локальными. Память для них выделяется в стеке, поэтому после окончания работы функции они удаляются из памяти. Нельзя возвращать указатель на локальную переменную, т. к. память, выделенная такой переменной, будет освобождаться.
int* f() { int a; … return &a;// ОШИБКА! }
Глобальные переменные – это переменные, описанные вне функций. Они видны во всех функциях, где нет локальных переменных с такими именами.
int a,b; //глобальные переменные void change() { int r; //локальная переменная r=a; a=b; b=r; }
void main() { cin>>a,b; change(); cout<<”a=”<<a<<”b=”<<b; }
Глобальные переменные также можно использовать для передачи данных между функциями, но этого не рекомендуется делать, т. к. это затрудняет отладку программы и препятствует помещению функций в библиотеки. Нужно стремиться к тому, чтобы функции были максимально независимы, а их интерфейс полностью определялся прототипом функции.
Функции и массивы Передача одномерных массивов как параметров функции
При использовании массива как параметра функции, в функцию передается указатель на его первый элемент, т. е. массив всегда передается по адресу. При этом теряется информация о количестве элементов в массиве, поэтому размерность массива следует передавать как отдельный параметр. Так как в функцию передается указатель на начало массива (передача по адресу), то массив может быть изменен за счет операторов тела функции.
//Удалить из массива все четные элементы #include <iostream.h> #include <stdlib.h>
//формирование массива //массив передается в функцию по адресу int form(int *a) { int n; cout<<"\nEnter n"; cin>>n;
for(int i=0;i<n;i++) a[i]=rand()%100;
//возвращается количество элементов в массиве return n; }
//печать массива void print(int *a,int n) { for(int i=0;i<n;i++) cout<<a[i]<<" "; cout<<"\n"; }
/*удаление четных элементов из массива, массив передается по адресу, количество элементов передается по адресу как ссылка */ void del(int *a, int& n) { int j=0,i,b[100]; for(i=0;i<n;i++) if(a[i]%2!=0) { b[j]=a[i]; j++; } n=j; for(i=0;i<n;i++) a[i]=b[i];
}
void main() { int a[100]; int n; n=form(a); //вызов функции формирования массива print(a,n); //вызов функции печати массива del(a,n); //вызов функции удаления элементов массива print(a,n); //вызов функции печати массива }
При использовании динамических массивов, в функцию передается указатель на область динамической памяти, в которой размещаются элементы массива. Функция также может возвращать указатель на область динамической памяти, в которой размещаются элементы массива.
//Удалить из массива все элементы, совпадающие с первым //элементом, используя динамическое выделение памяти. #include <iostream.h> #include <stdlib.h>
/*формирование массива, количество элементов массива передается по адресу как ссылка, функция возвращает указатель на динамический массив*/ int* form(int& n) { cout<<"\nEnter n"; cin>>n; //выделить динамическую область памяти под массив int* a=new int[n]; for(int i=0;i<n;i++) a[i]=rand()%100; //заполнить массив
//вернуть указатель на динамическую область памяти return a;
} void print(int*a,int n)//печать массива //в функцию передается указатель на массив и количество //элементов в массиве { for(int i=0;i<n;i++) cout<<a[i]<<" "; cout<<"\n"; }
/*удаление из массива в функцию передается указатель на массив и количество элементов в массиве по адресу, как ссылка */ int* del(int* a,int& n) { int k,j,i; //считаем количество элементов в новом массиве for(k=0,i=0;i<n;i++) if(a[i]!=a[0])k++; int* b; //выделяем память под вспомогательный массив b=new int[k]; //переписываем элементы из старого массива во //вспомогательный for(j=0,i=0;i<n;i++) if(a[i]!=a[0]) { b[j]=a[i]; j++; } n=k; //меняем количество элементов //возвращаем новый массив как результат функции return b; }
void main() { int* a; //указатель на динамический массив int n; //количество элементов в массиве a=form(n); //формируем массив print(a,n); //печатаем массив a=del(a,n); //удаляем элементы print(a,n); //печатаем массив }
Передача строк в качестве параметров функций
Строки при передаче в функции могут передаваться как одномерные массивы типа char или как указатели типа char*. В отличие от обычных массивов в функции не указывается длина строки, т. к. в конце строки есть признак конца строки ’\0’.
//Найти количество гласных букв в строке //Функция поиска заданного символа в строке int find(char* s, char c) { for (int I=0;I<strlen(s);I++) if(s[I]==c) return I; return –1 }
void main() { char s[255]; gets(s) char gl=”aouiey”;//строка, которая содержит гласные for(int I=0,k=0;I<strlen(s);I++) if(find(gl,s[I])>0)k++; printf(”%d”,k); }
|
||
Последнее изменение этой страницы: 2018-04-12; просмотров: 322. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |