Menu
CoddyTech

ポインタの比較

CoddyのCジャーニー「論理と制御フロー」セクションの一部。レッスン 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 < ptr2によって、ptr1が指す要素は、ptr2が指す要素よりも配列内で前にあるとわかることです。この関係により、配列を順番に処理するループの制御にポインター比較が自然に適しています。

challenge icon

チャレンジ

簡単

ポインターの比較を使用して配列を走査し、特定の範囲内にある要素を見つけるCプログラムを書いてください。プログラムでは、次の処理を行います。

  1. 8個の要素を持つscoresという名前の整数配列を宣言し、値{45, 78, 92, 63, 87, 34, 91, 56}で初期化する
  2. 整数へのポインターを2つ宣言する:start_ptrとend_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腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理と制御フローのすべてのレッスン

自分で練習してみよう: Cオンラインコンパイラ