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 %d 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

Эта задача проверяет ваше понимание операторов сравнения указателей в условиях цикла, использование арифметики указателей для установки граничных указателей и то, как сравнение указателей может управлять обходом массива более элегантно, чем традиционные циклы на основе счетчиков.

Шпаргалка

Указатели можно сравнивать с помощью операторов отношения: ==, !=, < и >.

При сравнении указателей вы сравниваете их адреса в памяти. Это полезно для определения относительного положения элементов внутри одного и того же массива.

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;
}
quiz iconПроверьте себя

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

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