Арифметика указателей в си.

Вопросы по языкам программирования Си и С++.
iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Арифметика указателей в си.

Сообщение iGrok » 13.02.2009 (Пт) 19:33

Кто-нибудь из знатоков (или не очень) "c" может мне подсказать, почему получается такой странный(на мой взгляд) результат при арифметических действиях с указателями?

Странность искать в строке с результатом pI + l.
pI = 4014016, l = 8.
При этом:
pI + l = 4014048 (!)
Но:
(long)pI + l = 4014024.

Почему так?

Вот исходник:
Код: Выделить всё
int main() {
    int     l;
    char    *buff;
    int     *pI, *pI2;

    l = 8;
    buff = malloc( 2 * l );

    pI = buff;
    pI2 = buff + l;

    printf("buff:\t\t%i\nl:    \t\t%i\npI:    \t\t%i\npI2=buff+l:\t%i\npI+l:  \t\t%i\n", buff, l, pI, pI2, pI + l);

    free( buff );
    return 0;
}


И вывод в консоль:
Код: Выделить всё
buff:           4014016
l:              8
pI:             4014016
pI2=buff+l:     4014024
pI+l:           4014048
label:
cli
jmp label

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Арифметика указателей в си.

Сообщение tyomitch » 13.02.2009 (Пт) 23:25

Потому что, по определению, *(a+b) тождественно a[b].
Инкремент множится на размер элемента.
Изображение

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Арифметика указателей в си.

Сообщение iGrok » 14.02.2009 (Сб) 3:25

tyomitch писал(а):Потому что, по определению, *(a+b) тождественно a[b].
Инкремент множится на размер элемента.

Ага. И когда я его привожу к (long) компилятор перестаёт думать, что это указатель на такой-то тип, и начинает распознавать его просто как адрес в памяти. И поэтому инкремент прибавляется просто как число, а не как кол-во элементов такого-то типа. Так?

Т.е. если pST у меня указатель на структуру в памяти, выделенной под массив таких структур, то pST++ сдвинет указатель не на 1 байт, а на следующую структуру.

Вроде понял. Спасибо. )
label:
cli
jmp label


Вернуться в С/С++

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList  
cron