Локальные и глобальные переменные



 

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

 

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-04; просмотров: 141;