printf
От: cyc10ne Россия http://sx.openbsd.ru/
Дата: 27.02.03 07:45
Оценка:
объясните пожалуйста почему вот эта программа

#include <stdio.h>

int
main(int argc, char *argv[])
{
        int i;

        for (i = 0; i < 10; ++i) {
                printf("\ti=%d\t%d\n", i, (int *)2 + i);
        }
        return (0);
}


после компиляции и запуска выводит следующее

i=0 2
i=1 6
i=2 10
i=3 14
i=4 18
i=5 22
i=6 26
i=7 30
i=8 34
i=9 38

получается что значение i умножается на 4 (это sizeof(int) либо sizof(int*)) и потом
к произведению прибавляется 2. но почему так происходит?
Re: printf
От: Bell Россия  
Дата: 27.02.03 07:54
Оценка:
Здравствуйте, cyc10ne, Вы писали:


printf("\ti=%d\t%d\n", i, (int *)2 + i);


Здесь двойка преобразуется к типу int*. Далее к указателю прибвляется целое. Так что здесь работают правила арифметики для указателей.
Т.е.

int n; 
int* ptr = &n;
int* ptr2 = ptr + 1;
int n2 = ptr2 - ptr;
//n2 == 4 == sizeof(int)
Любите книгу — источник знаний (с) М.Горький
Re: printf
От: VCoder http://wxbar.sf.net
Дата: 27.02.03 07:55
Оценка: 4 (1)
Здравствуйте, cyc10ne, Вы писали:

Дело в том, что в данном примере ты работаешь с указателями. Выражение (int *)2 означает "указатель на int". А затем к указателю прибавляется значение переменной i. Для указателей это означает, что прибавляется не i байт, а sizeof(t) где t-тип на который указывает указатель (в данном случае — int).
С уважением,
Дмитрий.
Re: printf
От: Ведмедь Россия  
Дата: 27.02.03 07:55
Оценка:
Здравствуйте, cyc10ne, Вы писали:

C>объясните пожалуйста почему вот эта программа


C>
C>#include <stdio.h>

C>int
C>main(int argc, char *argv[])
C>{
C>        int i;

C>        for (i = 0; i < 10; ++i) {
C>                printf("\ti=%d\t%d\n", i, (int *)2 + i);
C>        }
C>        return (0);
C>}
C>


C>после компиляции и запуска выводит следующее


C> i=0 2

C> i=1 6
C> i=2 10
C> i=3 14
C> i=4 18
C> i=5 22
C> i=6 26
C> i=7 30
C> i=8 34
C> i=9 38

C>получается что значение i умножается на 4 (это sizeof(int) либо sizof(int*)) и потом

C>к произведению прибавляется 2. но почему так происходит?

Нет, получаетсчя не так. сначала 2 приводится к типу int*, затем к нему прибавляется i. Но так как здесь работает уже адресная арифметика, и типа, к которому мы прибавляем i есть указатель на int, то прибавляется sizeof(int). ВСе правильно, а что смущяет?
Да пребудет с тобой Великий Джа
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.