デリファレンスとポインター演算
ポインターを通してメモリを読み取り、ポインター演算で配列をたどります。
「デリファレンスとポインター演算」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 生ポインターとアドレス演算子
- デリファレンスとポインター演算
- nullptrとnullポインターの安全性
- ポインターと参照の使い分け