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

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

このチャレンジでは、ループ条件におけるポインタ比較演算子の理解、境界ポインタを設定するためのポインタ演算の使用、およびポインタ比較が従来のカウンタベースのループよりもいかにエレガントに配列の走査を制御できるかをテストします。

チートシート

ポインタは、関係演算子(==!=<>)を使用して比較できます。

ポインタを比較するとき、それらのメモリ番地を比較しています。これは、同じ配列内の要素の相対的な位置を判断するのに役立ちます。

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");
}

ポインタの比較はループ条件において特に強力であり、カウンタ変数を使用する代わりにポインタの位置を比較することでループを制御できます。

int *current_ptr = numbers;
int *end_ptr = numbers + 4;

while (current_ptr <= end_ptr) {
    // 現在の要素を処理する
    current_ptr++;  // 次の要素へ移動する
}

ptr1 < ptr2 は、ptr1ptr2 が指す要素よりも配列内で前に現れる要素を指していることを意味します。

自分で試してみよう

#include <stdio.h>

int main() {
    // TODO: 以下にコードを記述してください
    
    return 0;
}
quiz icon腕試し

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

Logic & Flowのすべてのレッスン