Низови и функције

Функције које прихватају низ као аргумент, заправо прихватају као аргумент само адресу првог елемента низа. То има неколико последица:

  1. Функција не зна унапред колико елемената има низ, већ само где он у меморији почиње. Зато се дужина низа мора пренети посебним целобројним параметром. Ово важи за све низове.

  2. Свеједно је да ли ћемо у листи параметара написати нпр. double a[] или double *a, преводилац то увек разуме као double *a.
    Ако напишемо double a[], тада се димензија не наводи између [].

  3. Унутар функције се променљива a користи као показивач на double, тј. са њом се може радити све што и са било којим показивачем, укључујући и промене вредности.
    При том је небитно да ли је у листи параметара коришћена низовска или показивачка синтакса.

  4. Низови се увек преносе преко адресе, тј. за низ се никада не креира локална копија, као што је случај са осталим типовима података.
    Самим тим, промене на елементима низа унутар функције се одражавају на оригинални низ.

Функција не може да врати податак типа низ. Да бисмо као излазну величину добили низ (односно, елементе низа!) неопходно је да функција буде типа void и да као параметре има адресу почетка низа и број елемената низа:

void f(int a[], int n)
{
...... napunimo niz a ........
}

Функција f(a,n) (функција се позива тако што се као аргументи наводе само име низа и број елемената низа!) мења оригинални низ из позивајуће функције, па самим тим промене на низу остају и након завршетка функције f(a,n). На овај начин могуће је дефинисати функцију која ће служити за уношење елемената низа:

void unesi(int a[],int n)
{
	int i;
	for(i=0;i<n;i++) scanf("%d",&a[i]);
}

Пример: Написати програм који израчунава скаларни производ два низа (низови морају да имају исту величину). Скаларни производ представља збир производа елемената са истим индексима:
Задатак ћемо да решимо тако што ћемо дефинисати функцију mnozi која израчунава скаларни производ.

#include <stdio.h>
int mnozi(int x[], int y[], int n);/* prototip funkcije */
main()
{
int a[] = {1, 2, 3, 4, 5, 6}, b[] = {8, 7, 6, 5, 4, 3};
printf("Skalarno a*b = %d\n", mnozi(a, b, 6)); /* funkciju mnozi pozivamo iz funkcije printf */
}
int mnozi(int x[ ], int y[ ], int n)
{
int i;
int suma = 0;
for(i = 0; i < n; i++)
suma = suma + x[i] * y[i];
return suma;
}
Advertisements

Оставите одговор

Попуните детаље испод или притисните на иконицу да бисте се пријавили:

WordPress.com лого

Коментаришет користећи свој WordPress.com налог. Одјавите се / Промени )

Слика на Твитеру

Коментаришет користећи свој Twitter налог. Одјавите се / Промени )

Фејсбукова фотографија

Коментаришет користећи свој Facebook налог. Одјавите се / Промени )

Google+ photo

Коментаришет користећи свој Google+ налог. Одјавите се / Промени )

Повезивање са %s