Здравствуйте, столкнулся со сложным выражение на языке Си на тему указателей.
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;
Но, повторюсь еще раз, массив у вас заполнен мусором, следовательно и результат будет случайным.
int х [5] - вы объявили массив из 5 элементов типа int, то есть, зарезервировали под него место в памяти. Но почему-то вы его не инициализировали, то есть не присвоили значения всем 5 его элементам. Следовательно, он у вас заполнен "мусором",то есть совершенно случайными величинами.
i=&x[0]; k=&x[4]; здесь вы присваиваете значения указателям. i ссылается на первый элемент массива, к - на 5
j=k-i; Тут вы проводите операцию с указателями на тип int считая сдвиг между ними.
Так как k сдвинут относительно j на 4 позиции, то соответствующий результат и получаете.
Чтобы обратиться к содержимому массива, нужно разыменовать указатели, то есть что-то типа:
*j=*k-*i;
Но, повторюсь еще раз, массив у вас заполнен мусором, следовательно и результат будет случайным.
почитайте описание стандарта языка Си про арифметические действия с указателями. Вот если бы указатели были не на тип int, а на тип char - было бы другое значение (8 или 16, в зависимости от разрядности int).
Потому что расчеты с указателями осуществляются в единицах длины типа, на который указывает указатель (его называют типом указателя, например, указатель на целое считает в 32-битных системах в 4-хбайтовых единицах). Поэтому у Вас, например, i+1 будет указывать на следующее целое, а не на следующий байт целого.
C - это своего рода стенография, и чтобы не приходилось все время множить на размер типа указателя, вычитание и сложение идут в длинах этих типов, а не в байтах.
C - это своего рода стенография, и чтобы не приходилось все время множить на размер типа указателя, вычитание и сложение идут в длинах этих типов, а не в байтах.
Сергей Прокушев
Спасибо большое за грамотное наставление на путь.
Привет, тип int в большинстве компов 4 байта. У вас, видимо, 1 байт. В виртуальном адресном пространстве программы на С++ у вас нулевой элемент будет иметь адрес X, 4-й элемент будет иметь адрес Х+4. Именно взятие адреса есть оператор & т. е. взятие целого числа. Поэтому разность двух целых чисел будет равна 4. По идее должно быть 16.
Поправка: в данном случае по арифметике указателей разница будет 4, а не 8 и не 16. Потому что тип инт и арифметика указателей мать ее )))
Поправка: в данном случае по арифметике указателей разница будет 4, а не 8 и не 16. Потому что тип инт и арифметика указателей мать ее )))
Антоха ******
разность двух указателей не равна разности адресов по определению арифметики с указателями
int *p;
int i=(int) &p[5];
p+5==&p[5];
(int)p==i-5*sizeof(*p);
int *p;
int i=(int) &p[5];
p+5==&p[5];
(int)p==i-5*sizeof(*p);
Сухбат Химматов
Это где вы отыскали тип int а 1 байт длиной? Даже на восьмибитных микропроцессорах он был длиной в 2 байта :;)
Похожие вопросы
- Как создать массив указателей на числа? (язык Си)
- Почему язык СИ такой сложный?
- Программирование на языке СИ с использованием подпрограммы-функции
- Программирование на языке Си. Нужна небольшая помощь.
- какую программу лучше использовать для программирования на языке Си?
- Вопросы по языку СИ
- Язык Си. Читаю K&R (книга автора языка с примерами). Упражнение 1.10
- Функции в языке СИ
- Кто знает язык Си? ПОМОГИТЕ ПОЖАЛУЙСТА!!!
- Поменять местами первый и последний отрицательные элементы массива B (18). (Язык Си) (Язык Си)
вы все правильно поняли, изучаю указатели по книге и некоторые примеры не объясняются поэтому приходится уточнять их значимость.