Menu
Coddy logo textTech

Сравнение указателей

Часть раздела 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. Эта взаимосвязь делает сравнение указателей естественным инструментом для управления циклами, последовательно обрабатывающими массивы.

challenge icon

Задание

Легко

Напишите программу на языке C, которая использует сравнение указателей для обхода массива и поиска элементов в определенном диапазоне. Ваша программа должна:

  1. Объявить целочисленный массив с именем scores из 8 элементов и инициализировать его значениями {45, 78, 92, 63, 87, 34, 91, 56}
  2. Объявить два указателя на целые числа: start_ptr и end_ptr
  3. Установить start_ptr так, чтобы он указывал на первый элемент массива
  4. Установить end_ptr так, чтобы он указывал на последний элемент массива, используя арифметику указателей
  5. Объявить указатель с именем current_ptr и инициализировать его так, чтобы он указывал на первый элемент
  6. Использовать цикл while со сравнением указателей (current_ptr <= end_ptr) для обхода массива
  7. Внутри цикла:
    • Проверить, находится ли текущее значение в диапазоне от 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 для перехода к следующему элементу
  8. После цикла использовать сравнение указателей, чтобы убедиться, что current_ptr теперь находится за пределами массива, проверив условие current_ptr > end_ptr
  9. Если условие истинно, вывести "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;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Logic & Flow