Показивачи и низови

Низовима се у програмској језику C може управљати помоћу показивача. Ако се стандардне операције са низовима изведу помоћу показивача добија се на брзини програма, али програмски кôд постаје мање разумљив почетницима. Због тога се показивачи уводе тек након савладавања основних техника програмирања, стим да сваки C програмер мора да их савлада!

Већ је познато да, када се декларише низ, компајлер алоцира довољну количину меморије за чување вредности свих елемената низа. Назив низа наведен у декларацији је заправо показивач на први елемент низа! Адреса првог елемента низа је константна – не може се мењати у програму.

У следећем примеру:

    int a[5] = {3,5,1,9,4}, *pa = a;

декларисали смо низ a који има 5 целобројних елемената (елементе од a[0] до a[4]) и показивач pa који показује на први елемент низа a. Еквивалентан кôд би изгледао овако:

    int a[5] = {3,5,1,9,4}, *pa = &a[0];

Након декларације и иницијализације низа a и показивача pa, показивач pa можемо користити како би приступали елементима низа. На пример:

#include <stdio.h>
int main(void)
{
    int a[5] = {3,5,1,9,4}, *pa = a, i;
    for (i = 0; i < 5; i++)
    {
        printf("%d ", *pa);
        pa++;
    }
}

Уколико би линију кода printf(“%d “, *pa); заменили са једном од следећих линија:

printf("%d ", a[i]);
printf("%d ", i[a]);
printf("%p ", a+i);
printf("%d ", *(a+i));
printf("%d ", *a);

шта ће се исписати на излазу?

Након декларације низа int a[5], вредност a одговара вредношћу коју има показивач на први елемент низа a[0]. Пошто се сви елементи низа увек налазе у секвенцијалним меморијским локацијама (један поред другог), може се закључити да вредност a+1 одговара вредношћу показичана на други елемент низа a[1], вредност a+2 вредношћу на трећи елемент низа a+3 итд. Дакле, уместо a[i] може се писати *(a+i) или *(i+a) или i[a], a уместо &a[i] може се писати a+i или i+a. Напомена: израз је i[a] где се индекс низа налази испред угластих заграда, а низ унутар њих, јесте синтаксно исправан, али га треба избегавати!

Сада можемо дати одговор на претходно питање:

  • исписују се вредности елемената низа 3,5,1,9,4
  • исписују се вредности елемената низа 3,5,1,9,4
  • исписују се адресе елемената низа
  • исписују се вредности елемената низа 3,5,1,9,4
  • исписује се вредност првог елемента пет пута 3 3 3 3 3

Напомена: У програмском језику C не проверавају се границе низа, па је тако могуће приступати меморијским локацијама које не припадају елементима низа! Ако се у претходном примеру приступа локацијама a[10], *(a+10), a[-10], *(a-10)… иако низ има само пет елемената, компајлер ће дозволити компајлирање. У фази извршавања програма приступање локацијама ван граница низа може довести до промене вредности других променљивих који се налазе на тим локацијама или до прекида рада програма јер програм приступа меморијским локацијама које му нису додељене.