Сравнение указателей
Часть раздела 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 %d 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Эта задача проверяет ваше понимание операторов сравнения указателей в условиях цикла, использование арифметики указателей для установки граничных указателей и то, как сравнение указателей может управлять обходом массива более элегантно, чем традиционные циклы на основе счетчиков.
Шпаргалка
Указатели можно сравнивать с помощью операторов отношения: ==, !=, < и >.
При сравнении указателей вы сравниваете их адреса в памяти. Это полезно для определения относительного положения элементов внутри одного и того же массива.
int numbers[5] = {10, 20, 30, 40, 50};
int *start = numbers; // Points to first element
int *end = numbers + 4; // Points to last element
if (start < end) {
printf("start comes before end in memory");
}Сравнение указателей особенно эффективно в условиях циклов, позволяя управлять циклами путем сравнения позиций указателей вместо использования переменных-счетчиков:
int *current_ptr = numbers;
int *end_ptr = numbers + 4;
while (current_ptr <= end_ptr) {
// Process current element
current_ptr++; // Move to next element
}Выражение ptr1 < ptr2 означает, что ptr1 указывает на элемент, который находится в массиве раньше, чем элемент, на который указывает ptr2.
Попробуйте сами
#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()Итоги: основные строковые функции