объясните пожалуйста почему вот эта программа
#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. но почему так происходит?
Здравствуйте, 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)
Здравствуйте, 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). ВСе правильно, а что смущяет?