0Pricing
C++ Academy · レッスン

デリファレンスとポインター演算

ポインターを通してメモリを読み取り、ポインター演算で配列をたどります。

「デリファレンスとポインター演算」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

ポインター経由で読み取る

単項演算子*は、ポインターが指す値を読み取ります。

int x = 42;
int* p = &x;
std::cout << *p;   // 42

ポインター経由で書き込む

代入の左辺に*pを置いて、指し先に値を書き込むこともできます。

*p = 100;
std::cout << x;   // 100

アロー演算子

構造体またはクラスへのポインターでは、p->memberは(*p).memberの省略形です。アロー演算子を使うのが慣例です。

struct Point { int x, y; };
Point pt{3, 4};
Point* p = &pt;
std::cout << p->x;   // 3

ポインター演算の基礎

ポインターには整数を加算したり減算したりできます。結果はバイト単位ではなく、要素のサイズ単位で移動します。

int a[5] = {10, 20, 30, 40, 50};
int* p = a;        // points to a[0]
p = p + 2;         // now points to a[2]
std::cout << *p;   // 30

配列を走査する

ポインター演算はインデックス指定と同じように使えます。a[i]と*(a + i)は同じ意味であり、p[i]はどのポインターでも使えます。

int a[] = {1, 2, 3, 4};
int* p = a;
for (int i = 0; i < 4; ++i) {
    std::cout << *(p + i) << " ";
}

2つのポインターの差

同じ配列内を指す2つのポインターを減算すると、要素間の距離が得られます。型はstd::ptrdiff_tです。

int a[5];
int* first = a;
int* last  = a + 5;
std::ptrdiff_t len = last - first;  // 5

ポインターを比較する

ポインターは==と!=で等価性を比較でき、同じ配列内を指している場合に限り<で順序を比較できます。

ポインターで反復処理する

慣用的なC形式の反復処理では、開始位置と終了位置の2つのポインターを使います。

int a[] = {1, 2, 3, 4, 5};
for (int* p = a; p != a + 5; ++p) {
    std::cout << *p << " ";
}

末尾の次までは許可される

最後の要素の1つ先を指すポインター(「end」ポインター)は計算できます。ただし、そのポインターをデリファレンスすると未定義動作になります。

ポインター演算の落とし穴

よくある間違いは次のとおりです。

  • 配列の境界を越える
  • ポインター型を混在させる(int* + char*)
  • 演算がバイト単位ではなく要素単位で行われることを忘れる

イテレーターまたは範囲を優先する

現代のC++では、生のポインター演算よりもイテレーターとrangesライブラリが好まれます。ポインターはC APIや非常に低レベルなコードでは依然として重要です。

クイックチェック

pが4バイトのintの先頭を指すint*の場合、p + 1は何を指しますか?

まとめ

*pで指し先を読み取ったり書き込んだりします。p->memberで構造体のメンバーにアクセスします。ポインター演算は要素のサイズ単位で移動します。慎重に使ってください。現代のコードでは、通常、イテレーターと範囲のほうが安全です。

よくある質問

「デリファレンスとポインター演算」レッスンは無料ですか?

はい。「デリファレンスとポインター演算」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「デリファレンスとポインター演算」で何を学びますか?

ポインターを通してメモリを読み取り、ポインター演算で配列をたどります。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「デリファレンスとポインター演算」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 生ポインターとアドレス演算子
  2. デリファレンスとポインター演算
  3. nullptrとnullポインターの安全性
  4. ポインターと参照の使い分け
← C++ Academyに戻る