Операции с указателями. Как уже говорилось выше, указатели допускают несколько видов операций над ними
Как уже говорилось выше, указатели допускают несколько видов операций над ними. В частности разность двух указателей есть число, а указатель плюс число есть опять указатель.
Разберемся поподробнее.
char c1 = ‘h’; char c2 = ‘e’; char c3 = ‘l’; char c4 = ‘l’; char c5 = ‘o’; char c6 = 0; // чертов C++ позволяет вот так символ рассматривать как число от // 0 до 255 и оперировать с ним как с числом char *ptr = &c1; char *nptr; // *ptr => ‘h’
В результате, в памяти будет следующая последовательность байтов:
Теперь прибавим к первому указателю 4 и запишем результат во второй указатель:
nptr = ptr+4; // *nptr => ‘o’
То есть второй указатель теперь указывает на последний из символов. Также справедливо следующее:
// nptr-ptr => 4; // *(ptr+1) => ‘e’ // *(ptr+2) => ‘l’ // *(ptr+3) => ‘l’ // *(ptr+4) => ‘o’ // *(ptr+5) => 0
То есть указатель плюс число есть новый указатель, у которого потом с помощью символа * можно получить значение переменной по новому адресу. Тонкий момент, который здесь нужно учесть заключается в следующем.
Если к указателю ptr прибавить число i, то в результате получится адрес, смещенный не на i байтов, а на i*sizeof(type) байтов, где type – это тип переменной, на которую указывает указатель. То есть отсчет идет не в байтах, а как бы в единицах того типа, на который указывает указатель. Если ptr есть указатель на char, то так как char занимает в памяти один байт, ptr+1 указывает на область памяти, отстоящую от ptr действительно на 1 байт. А если ptr есть указатель на int, то ptr+1 указывает на область памяти, отстоящую от ptr на два байта, потому что переменная типа int занимает в памяти 2 байта. Аналогично, разность ptr2-ptr1 даст не количество байтов между областями памяти, на которые указывают ptr1 и ptr2, а количество переменных, которые могут «уместиться» в памяти между ptr1 и ptr2. Причем переменных именно того типа, указателями на который ptr1 и ptr2 являются.
|