Аритметика с указатели
Когато целочислен израз се добави към или извади от указател, резултатът е указател от същия тип. Ако указателят сочи към елемент на масив и масивът е достатъчно голям, то резултатът ще бъде указател към елемент от същия масив, отместен със съответния брой елементи. С други думи, ако указателят 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 не е дефиниран, тъй като двата указателя не сочат към елементи на един и същ масив.
Pingback: CPP-101: Кратък обзор на езика за програмиране C++ | Записки по програмиране