Другие языки программирования и технологии

Указатели в языке Си

Здравствуйте, столкнулся со сложным выражение на языке Си на тему указателей.

int x[5], *i, *k, j;
i=&x[0]; k=&x[4]; j=k-i;

Не могу разобраться почему j принимает значение 4, а не 8.
Объясните как все здесь происходит?
Если я все правильно понял:
int х [5] - вы объявили массив из 5 элементов типа int, то есть, зарезервировали под него место в памяти. Но почему-то вы его не инициализировали, то есть не присвоили значения всем 5 его элементам. Следовательно, он у вас заполнен "мусором",то есть совершенно случайными величинами.

i=&x[0]; k=&x[4]; здесь вы присваиваете значения указателям. i ссылается на первый элемент массива, к - на 5

j=k-i; Тут вы проводите операцию с указателями на тип int считая сдвиг между ними.
Так как k сдвинут относительно j на 4 позиции, то соответствующий результат и получаете.
Чтобы обратиться к содержимому массива, нужно разыменовать указатели, то есть что-то типа:
*j=*k-*i;
Но, повторюсь еще раз, массив у вас заполнен мусором, следовательно и результат будет случайным.
Дмитрий Остроух
Дмитрий Остроух
15 192
Лучший ответ
Джемшит Реджепов ему не нужно вычислять значения, он с адресами работает, разыменование там не нужно) arr[5] - массив из 5 элементов, не 6)
Сергей Прокушев Большое спасибо!
вы все правильно поняли, изучаю указатели по книге и некоторые примеры не объясняются поэтому приходится уточнять их значимость.
почитайте описание стандарта языка Си про арифметические действия с указателями. Вот если бы указатели были не на тип int, а на тип char - было бы другое значение (8 или 16, в зависимости от разрядности int).
Антоха ******
Антоха ******
61 844
Потому что расчеты с указателями осуществляются в единицах длины типа, на который указывает указатель (его называют типом указателя, например, указатель на целое считает в 32-битных системах в 4-хбайтовых единицах). Поэтому у Вас, например, i+1 будет указывать на следующее целое, а не на следующий байт целого.
C - это своего рода стенография, и чтобы не приходилось все время множить на размер типа указателя, вычитание и сложение идут в длинах этих типов, а не в байтах.
Сергей Прокушев Спасибо большое за грамотное наставление на путь.
Привет, тип int в большинстве компов 4 байта. У вас, видимо, 1 байт. В виртуальном адресном пространстве программы на С++ у вас нулевой элемент будет иметь адрес X, 4-й элемент будет иметь адрес Х+4. Именно взятие адреса есть оператор & т. е. взятие целого числа. Поэтому разность двух целых чисел будет равна 4. По идее должно быть 16.

Поправка: в данном случае по арифметике указателей разница будет 4, а не 8 и не 16. Потому что тип инт и арифметика указателей мать ее )))
Антоха ****** разность двух указателей не равна разности адресов по определению арифметики с указателями
int *p;
int i=(int) &p[5];
p+5==&p[5];
(int)p==i-5*sizeof(*p);
Сухбат Химматов Это где вы отыскали тип int а 1 байт длиной? Даже на восьмибитных микропроцессорах он был длиной в 2 байта :;)