Подсетите се једнодимензионалних низова из првог разреда. Низ као изведени тип података припада групи хомогених типова, што значи да су сви његови елементи истог типа. Сваки елемент у низу има тачно одређену позицију на основу које му се додељује јединствени индекс. Вредност индекса првог елемента је 0, другог 1, трећег 2 итд. што значи да је индекс низа типа int. Елементи низа могу бити било ког типа података који постоји у програмском језику C, стим да сви морају бити истог типа. Сви елементи низа налазе се у суседним (секвенцијалним) меморијским локацијама. Пошто су сви елементи низа индексирани и истог типа, лако им је приступити, претражити их, сортирати их итд. Као и све друге променљиве које смо до сада користили и низове морамо декларисати пре употребе. Општи облик декларације низа изгледа овако:
tip identifikator[veličina];
Правила за именовање низа не разликују се од правила за именовање променљивих које смо до сада користили. Величина низа је целобројна позитивна константа типа int (цео број већи од нуле). На пример, декларацијом int A[5];
декларисали смо низ А
који има пет елемената типа int
. Иницијализацијом низа додељујемо елементима низа конкретне вредности, на пример int A[5] = { 10,21,13,44,25 };
. Број елемената у витичастој загради мора бити једнак или мањи од задате величине низа. Уколико је број додељених вредности мањи од величине низа, на преостала места постављају се подразумеване вредности које зависе од типа, на пример за int
је то 0
, за float
и double
0.0
. Приликом иницијализације низа, могуће је изоставити његову величину, што се назива делимична иницијализација, на пример int A[] = { 10,21,13,44,25 };
. У оба примера иницијализовали смо низ А
који има пет целобројих елемената и то: A[0]=10
, A[1]=21
, A[2]=13
, A[3]=44
, A[4]=25
.
Низовима се у програмској језику C може управљати помоћу показивача. Како? Идентификатор низа наведен у декларацији је уједно и показивач на први елемент низа! Адреса првог елемента низа је константна – не може се мењати у програму. У следећем примеру:
#include <stdio.h>
main()
{
int a[5] = { 3,5,1,9,4 }, *pa = a;
printf("%d", *pa);
}
декларисали смо низ a
који има пет целобројних елемената и показивач pa
који показује на низ a
, тј. на његов први елемент. То значи да би се извршењем овог програма на излазу исписао број 3
– вредност првог елемента низа a
. Еквивалентан кôд би изгледао овако:
#include <stdio.h>
main()
{
int a[5] = { 3,5,1,9,4 }, *pa = &a[0];
printf("%d", *pa);
}
Након иницијализације низа a
и показивача pa
, показивач pa
можемо користити како би приступали елементима низа. Извршењем следеће програма:
#include <stdio.h>
main()
{
int a[5] = { 3,5,1,9,4 }, *pa = a;
for (int i = 0; i < 5; i++)
{
printf("%d ", *pa);
pa++;
}
}
на излазу ће се исписати редом елементи низа: 3 5 1 9 4
. Уколико би линију кода printf(“%d “, *pa);
заменили са једном од следећих линија:
printf("%d ", a[i]);
printf("%d ", i[a]);
printf("%p ", a+i);
printf("%d ", *(a+i));
printf("%d ", *a);
шта ће се исписати на излазу? Вредност на коју показује показивач на a
једнака је вредношћу на коју показује показивач на први елемент низа a[0]
. Пошто се сви елементи низа увек налазе у секвенцијалним меморијским локацијама, може се закључити да вредност на коју показује показивач на a+1
одговара вредношћу на коју показује показича на други елемент a[1]
, вредност на коју показује показивач на a+2
једнака је вредношћу на коју показује показивач на трећи елемент a[2] итд. Дакле, уместо a[i]
може се писати *(a+i)
или *(i+a)
или i[a]
, a уместо &a[i]
може се писати a+i
или i+a
. Израз i[a]
где се индекс низа налази испред угластих заграда, а инентификатор низа унутар њих, јесте синтаксно могућ, али га треба избегавати! Сада можемо дати одговор на претходно питање:
printf("%d ", a[i]); // исписују се вредности елемената низа 3 5 1 9 4
printf("%d ", i[a]); // исписују се вредности елемената низа 3 5 1 9 4
printf("%p ", a+i); // исписују се адресе елемената низа
printf("%d ", *(a+i)); // исписују се вредности елемената низа 3 5 1 9 4
printf("%d ", *a); // исписује се вредност првог елемента пет пута 3 3 3 3 3
У програмском језику C не проверавају се границе низа, па је тако могуће приступати меморијским локацијама које не припадају елементима низа и читати или мењати вредности у тим локацијама! Ако се у претходном примеру приступа локацијама ван граница низа, компајлер ће то дозволити и програм ће се извршити.


Јасно је да приступ и модификација насумичних (или циљаних) меморијских локација може да изазове грешке које даље могу изазвати неправилан рад програма, пуцање програма и нестабилност рада система.
Задаци за вежбу
Приручник 2022/54. Дат је део кода написан на програмском језику C:
int a[7] = { 10,25,30,15,40,77,45 }, * pa, x, y;
pa = a + 4;
x = --(*pa) + 5;
y = *(--pa) + 5;
Анализирати код и одредити вредности променљивих х
и y
, као и показивача pa
, по извршењу све три извршне наредбе датог кода:
x = 44
y = 20
pa = a + 3
Приручник 2022/55. Дат је део кода написан на програмском језику C:
int a[7] = { 81,12,35,97,40,52,17 }, *pa, x, y;
pa = a + 3;
x = *(pa - 2) + 1;
y = (*pa - 2) + 1;
Анализирати код и одредити вредности променљивих х
и y
, као и показивача pa
, по извршењу све три извршне наредбе датог кода:
x = 13
y = 96
pa = a + 3
Приручник 2022/62. Са леве стране су набројани различити типови променљивих, а са десне су дате декларације променљивих у програмском језику C. На линију испред декларације унети редни број под којим је наведен одговарајући тип променљиве:
1. Једнодимензионални низ показивача на целе бројеве | 3 | int *a; |
2. Вектор целих бројева | 2 | int a[100]; |
3. Показивач на цео број | 5 | int a*[100]; |
4. Цео број | 1 | int *a[100]; |
5. Грешка у декларацији |