CPP-101: Указатели и масиви

Аритметика с указатели

Аритметика с указатели: събиране и изваждане на цяло число и указател

Когато целочислен израз се добави към или извади от указател, резултатът е указател от същия тип. Ако указателят сочи към елемент на масив и масивът е достатъчно голям, то резултатът ще бъде указател към елемент от същия масив, отместен със съответния брой елементи. С други думи, ако указателят ptr сочи към i-тия елемент на даден масив, а n е цяло число, то изразът ptr+n ще сочи към (i+n)-тия елемент на масива, а ptr-n ще сочи към (i-n)-тия елемент, в случай, че такива елементи съществуват.

Дефиницията на езика гарантира, че стойността на указател, насочен с едно след последния елемент на масива е смислена, добре дефинирана и може да се използва при сравнение с други указатели и аритметични операции с указатели.

Аритметика с указатели: указател насочен с едно след последният елемент на масива

Ако указателят p сочи към последния елемент на даден масив (виж фигурата), то (p+1) e указател насочен с едно след последния елемент на масива. Ако указателят q сочи с едно след последния елемент на масива (виж отново
фигурата), то (q-1) сочи към последния елемент на масива.

Трябва да се отбележи, че резултатът от операциите събиране и изваждане на указател с цяло число е добре дефиниран само когато и указателят и резултатът от операцията са насочени към елементи на един и същ масив или с едно след последния елемент на масива. Например:

int v[10];
int* p1=v+11;
int* p2=v+12;
int* p3=v-1;

Операцията в ред 2 е коректна, тъй като резултатът ще бъде указател насочен с едно след последния елемент на масива v. Резултатът от операциите в ред 3 и 4 не е дефиниран. Това означава, че използването на такива указатели в аритметични операции или сравнение с други указатели няма да доведе до предвидими резултати.

Изваждането на един указател от друг указател е дефинирано само в случай, че двата указателя сочат към елементи на един и същ масив. Резултатът от изваждането на два указателя е равен на броя елементи на масива, разположени между указателите. Ако указателят p сочи към i-тия елемент от масива (виж фигурата), а указателят q сочи към j-тия елемент, то разликата между двата указателя (q-p) ще бъде равна на j-i=n. Резултатът от изваждането на двата указателя е число със знак, т.е. резултатът от p-q е i-j=-n.

Аритметика с указатели: изваждане на указатели

Да разгледаме следния фрагмент:

int v1[10], v2[10];
int i1=&v1[5]-&v1[3];
int i2=&v1[5]-&v2[3]; // резултатът не е дефиниран

В резултат на операцията в ред 2 променливата i1 получава стойност 2. Резултатът от операцията в ред 3 не е дефиниран, тъй като двата указателя не сочат към елементи на един и същ масив.

Публикувано в CPP-101, ООП с етикети , , . Постоянна връзка.

Един коментар по CPP-101: Указатели и масиви

  1. Pingback: CPP-101: Кратък обзор на езика за програмиране C++ | Записки по програмиране

Коментарите са затворени.