Сравнение указателей
Часть раздела Logic & Flow путешествия по C на Coddy — урок 10 из 63.
Вы узнали, как перемещаться по массивам, используя арифметику указателей. Теперь вы узнаете, что указатели также можно сравнивать, используя те же операторы отношения, которые вы используете с обычными переменными: ==, !=, < и >.
Когда вы сравниваете два указателя, вы сравниваете их адреса в памяти. Это особенно полезно, когда оба указателя указывают на элементы одного и того же массива, так как это позволяет определить их относительное положение в памяти.
int numbers[5] = {10, 20, 30, 40, 50};
int *start = numbers; // Указывает на первый элемент
int *end = numbers + 4; // Указывает на последний элемент
if (start < end) {
printf("start comes before end in memory");
}Сравнение указателей становится особенно эффективным в условиях циклов. Вместо использования переменной-счетчика вы можете сравнивать текущую позицию указателя с целевым указателем, чтобы контролировать момент остановки цикла. Это позволяет создавать элегантный и эффективный код для обхода массивов.
Ключевая идея заключается в том, что ptr1 < ptr2 говорит о том, что ptr1 указывает на элемент, который расположен в массиве раньше, чем элемент, на который указывает ptr2. Эта взаимосвязь делает сравнение указателей естественным инструментом для управления циклами, последовательно обрабатывающими массивы.
Задание
ЛегкоНапишите программу на языке C, которая использует сравнение указателей для обхода массива и поиска элементов в определенном диапазоне. Ваша программа должна:
- Объявить целочисленный массив с именем
scoresиз 8 элементов и инициализировать его значениями {45, 78, 92, 63, 87, 34, 91, 56} - Объявить два указателя на целые числа:
start_ptrиend_ptr - Установить
start_ptrтак, чтобы он указывал на первый элемент массива - Установить
end_ptrтак, чтобы он указывал на последний элемент массива, используя арифметику указателей - Объявить указатель с именем
current_ptrи инициализировать его так, чтобы он указывал на первый элемент - Использовать цикл while со сравнением указателей (
current_ptr <= end_ptr) для обхода массива - Внутри цикла:
- Проверить, находится ли текущее значение в диапазоне от 60 до 90 (включительно)
- Если значение находится в диапазоне, вывести "Value %d is in range" (используя "Value [value] is in range")
- Если значение не входит в диапазон, вывести "Value %d is out of range" (используя "Value [value] is out of range")
- Инкрементировать
current_ptrдля перехода к следующему элементу
- После цикла использовать сравнение указателей, чтобы убедиться, что
current_ptrтеперь находится за пределами массива, проверив условиеcurrent_ptr > end_ptr - Если условие истинно, вывести "Traversal complete"
Ваш вывод должен отображать результаты в следующем формате:
Value 45 is out of range
Value 78 is in range
Value 92 is out of range
Value 63 is in range
Value 87 is in range
Value 34 is out of range
Value 91 is out of range
Value 56 is out of range
Traversal completeЭта задача проверяет ваше понимание операторов сравнения указателей в условиях цикла, использование арифметики указателей для установки граничных указателей и то, как сравнение указателей может управлять обходом массива более элегантно, чем традиционные циклы на основе счетчиков.
Попробуйте сами
#include <stdio.h>
int main() {
// TODO: Напишите свой код ниже
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции