Концептот на низата е многу врзан (поврзан) со оној на
покажувачот. Всушност, идентификаторот на низата е еквивалентен на адресата на нејзиниот прв елемент, бидејќи покажувачот е еквивалентен на адресата на првиот елемент на кој тој укажува, па всушност тие се исти концепти. На пример, претпоставувајќи ги овие две декларации:
int numbers [20];
int * p; Следнава операција на доделување би била валидна: p = numbers; //p ke pokazuva na prviot element na nizata После тоа, p и броевите би биле еквивалентни и би имале исти својства. Единствената разлика е во тоа што можеме да ја смениме вредноста на покажувачот p од друга, додека броевите секогаш ќе укажуваат на првиот од 20-те елементи од типот int со кој беше дефиниран. Затоа, за разлика од p, што е обичен покажувач, броевите се низа, а низата може да се смета за постојан покажувач. Затоа, следнава распределба не би била валидна:
numbers = p; //vaka ne moze
Бидејќи броевите се низа, така што работи како константен покажувач, и не можеме да ги доделиме вредностите кон константите. Поради карактеристиките на променливите, сите изрази кои вклучуваат насоки во следниов пример се совршено валидни:
// p-12 Nizi i pointeri
// more pointers #include <iostream> using namespace std; int main () { int numbers[5]; //se deklarira niza numbers koja sodrzi 5 celi broevi int * p; //se deklarira pokazuvac kon int p = numbers; //p pokazuva na prviot element na nizata *p = 10; //tamu kade sto pokazuva p se smestuva 10 p++; //p se pomestuva za 1 (seka pokazuva na vtoriot element na nizata) *p = 20; //tamu kade sto pokazuva p se smestuva 20 p = &numbers[2]; //p pokazuva na tretiot element (toj ima indeks 2) *p = 30; //tamu kade sto pokazuva p se smestuva 30 p = numbers + 3; // p pokazuva na pocetokot + 3 lokacii, znaci na cetvrtiot element *p = 40; //tamu kade sto pokazuva p se smestuva 40 p = numbers; // p pokazuva na prviot element *(p+4) = 50; //tamu kade sto pokazuva (p+4), znaci na pettiot element se smestuva 50
//se pecati nizata cout<<”Nizata numbers izgleda vaka: “<<endl; for (int n=0; n<5; n++) cout << numbers[n] << ", "; cout<<endl; system(“pause”); return 0; } Во поглавјето за низи користевме загради ([]) неколку пати за да го наведеме индексот на елементот на низата на која сакаме да ја повикаме. Па, оваа група оператори [] се исто така оператор за дереференција познат како офсет оператор. Тие ја намалуваат променливата што ја следат само како * , но исто така го додаваат бројот помеѓу загради на адресата . На пример: a[5] = 0; // a [offset of 5] = 0 *(a+5) = 0; // pointed by (a+5) = 0 Овие два изрази се еквивалентни и валидни ако a е покажувач или ако a е низа. Уште една програма со низа и покажувач кон низата:
#include <iostream>
using namespace std;
const int MAX = 3;
int main () { int var[MAX] = {10, 100, 200}; int *ptr;
// let us have array address in pointer. ptr = var; //ptr pokazuva na prviot element na nizata for (int i = 0; i < MAX; i++) { cout << "Address of var[" << i << "] = "; cout << ptr << endl<<endl;
cout << "Value of var[" << i << "] = "; cout << *ptr << endl<<endl;
// point to the next location ptr++; } system("pause"); return 0; }