Menu
Coddy logo textTech

ポインタの比較

CoddyのCジャーニー「Logic & Flow」セクションの一部 — レッスン 10/63。

ポインタ演算を使用して配列内を移動する方法を学びました。今度は、通常の変数で使用するのと同じ関係演算子を使用して、ポインタも比較できることを学びます: ==, !=, <, および >

2つのポインタを比較するとき、それらのメモリ番地を比較しています。これは、両方のポインタが同じ配列内の要素を指している場合に特に便利です。これにより、メモリ内での相対的な位置を判断できるからです。

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 < ptr2ptr1ptr2 の指す要素よりも配列内で前に現れる要素を指していることを示しているという点です。この関係により、ポインタの比較は、配列を順次処理するループを制御するのに自然に適したものとなります。

challenge icon

チャレンジ

簡単

ポインタ比較を使用して配列を走査し、特定の範囲内の要素を見つけるCプログラムを作成してください。プログラムは以下の手順に従う必要があります:

  1. 8つの要素を持つ scores という名前の整数配列を宣言し、値 {45, 78, 92, 63, 87, 34, 91, 56} で初期化します。
  2. 整数への2つのポインタ start_ptrend_ptr を宣言します。
  3. start_ptr が配列の最初の要素を指すように設定します。
  4. ポインタ演算を使用して、end_ptr が配列の最後の要素を指すように設定します。
  5. current_ptr という名前のポインタを宣言し、最初の要素を指すように初期化します。
  6. ポインタ比較 (current_ptr <= end_ptr) を用いた while ループを使用して、配列を走査します。
  7. ループ内:
    • 現在の値が 60 から 90 の間(両端を含む)であるか確認します。
    • 値が範囲内の場合、"Value [value] is in range" と出力します。
    • 値が範囲外の場合、"Value [value] is out of range" と出力します。
    • current_ptr をインクリメントして、次の要素に移動します。
  8. ループの後、ポインタ比較を使用して current_ptr > end_ptr かどうかをチェックし、current_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のすべてのレッスン