Передача одномерных массивов как параметров функции
Функции и массивы
Локальные и глобальные переменные
Переменные, которые используются внутри данной функции, называются локальными. Память для них выделяется в стеке, поэтому после окончания работы функции они удаляются из памяти. Нельзя возвращать указатель на локальную переменную, т. к. память, выделенная такой переменной будет освобождаться.
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;
}
Глобальные переменные также можно использовать для передачи данных между функциями, но этого не рекомендуется делать, т. к. это затрудняет отладку программы и препятствует помещению функций в библиотеки. Нужно стремиться к тому, чтобы функции были максимально независимы, а их интерфейс полностью определялся прототипом функции.
|
|
При использовании массива как параметра функции, в функцию передается указатель на его первый элемент, т. е. массив всегда передается по адресу. При этом теряется информация о количестве элементов в массиве, поэтому размерность массива следует передавать как отдельный параметр. Так как в функцию передается указатель на начало массива (передача по адресу), то массив может быть изменен за счет операторов тела функции.
Пример1:
Удалить из массива все четные элементы
#include <iostream.h>
#include <stdlib.h>
int form(int a[100])
{
int n;
cout<<"\nEnter n";
cin>>n;
for(int i=0;i<n;i++)
a[i]=rand()%100;
return n;
}
void print(int a[100],int n)
{
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<"\n";
}
void Dell(int a[100],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);
Dell(a,n);
print(a,n);
}
Пример 2
Удалить из массива все элементы, совпадающие с первым элементом, используя динамическое выделение памяти.
#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*Dell(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=Dell(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(gl);I++)
if(find(s,gl[I])>0)k++;
printf(“%d”,k);
}