Pointer vs Array
Показалецът е тип данни, който съдържа препратка към място в паметта (т.е. променлива показалец съхранява адрес на място в паметта, в което се съхраняват някои данни). Масивите са най-често използваната структура на данни за съхраняване на колекция от елементи. Повечето езици за програмиране предоставят методи за лесно деклариране на масиви и достъп до елементи в масивите.
Какво е показалец?
Показалецът е тип данни, който съхранява адрес на място в паметта, в което се съхраняват някои данни. С други думи, показалец съдържа препратка към място в паметта. Достъпът до данните, съхранявани в мястото на паметта, на което се позовава показалеца, се нарича dereferencing. При извършване на повтарящи се операции като пресичане на дървета / низове, търсене на таблици и т.н., използването на указатели би подобрило производителността. Това е така, защото пренасочването и копирането на указатели е по-евтино от действителното копиране и достъп до данните, посочени от указателите. Нулев указател е указател, който не сочи към нищо. В Java достъпът до нулев указател би генерирал изключение, наречено NullPointerException.
Какво е масив?
Показан на фигура 1, е парче код, който обикновено се използва за деклариране и присвояване на стойности на масив. Фигура 2 изобразява как би изглеждал масив в паметта.
int стойности [5]; стойности [0] = 100; стойности [1] = 101; стойности [2] = 102; стойности [3] = 103; стойности [4] = 104; |
Фигура 1: Код за деклариране и присвояване на стойности на масив
100 | 101 | 102 | 103 | 104 |
Индекс: 0 | 1 | 2 | 3 | 4 |
Фигура 2: Масив, запазен в паметта
По-горе кодът определя масив, който може да съхранява 5 цели числа и до тях се осъществява достъп чрез индекси от 0 до 4. Едно важно свойство на масив е, че целият масив е разпределен като един блок памет и всеки елемент получава собствено пространство в масива , След като бъде определен масив, неговият размер е фиксиран. Така че, ако не сте сигурни в размера на масива по време на компилиране, ще трябва да определите достатъчно голям масив, за да бъдете в безопасната страна. Но в повечето случаи всъщност ще използваме по-малък брой елементи, отколкото сме разпределили. Значи значителна част от паметта всъщност се губи. От друга страна, ако „достатъчно големият масив“ всъщност не е достатъчно голям, програмата ще се срине.
Каква е разликата между Pointers и Arrays?
Показалецът е тип данни, който съхранява адрес на място в паметта, в което се съхраняват някои данни, докато масивите са най-често използваната структура на данни за съхраняване на колекция от елементи. В езика за програмиране на C, индексирането на масива се извършва с помощта на указателна аритметика (т.е. i-тият елемент от масива x би бил еквивалентен на * (x + i)). Следователно в C набор от указатели, които сочат към набор от последователни места в паметта, може да се мисли като масив. Освен това има разлика в начина, по който операторът sizeof оперира с указатели и масиви. Когато се приложи към масив, операторът sizeof ще върне целия размер на масива, докато когато се приложи към показалец, той ще върне точно размера на показалеца.