C++でポインタを参照渡しする理由とは?
C++プログラミングにおいて、ポインタが指し示すオブジェクトそのものではなく、ポインタ自体を変更したい場合には、ポインタを参照渡し(参照による受け渡し)します。
通常、ポインタを値渡しすると、関数内ではポインタのコピーが操作されるため、呼び出し元のポインタが保持するアドレスは変更されません。しかし、参照渡しにすることで、関数内での変更が呼び出し元のポインタに直接反映されるようになります。
サンプルコード
以下は、ポインタを参照渡しする方法の具体例です。
#include <iostream>
using namespace std;
void Decrement( int*& d ) {
--d;
}
int main( void ) {
int a = 26;
int* ptr = &a; // 渡すポインタ
// デクリメント前のアドレスを表示
cout<<"Before: "<< ptr << endl;
Decrement( ptr);
// デクリメント後のアドレスを表示
cout<<"After: " << ptr;
return 0;
}この例では、Decrement 関数の引数が int*& 型、つまり「intへのポインタへの参照」として宣言されています。関数内で --d を実行すると、ポインタが保持しているアドレスそのものが、int型のサイズ分だけ手前に移動します。
出力結果
Before: 0x6ffe3c After: 0x6ffe38
実行結果を見ると、ptr のアドレスが 0x6ffe3c から 0x6ffe38 へと変化しています。これは int型のサイズ(多くの環境で4バイト)分だけアドレスが減少したことを意味します。
もしポインタが値渡しされていた場合、Decrement 関数内での変更はコピーに対して行われるだけで、main 関数側の ptr には一切反映されませんでした。このように、関数側から呼び出し元のポインタを書き換えたいケースでは、参照渡しが有効な手段となります。
-
C++のポインタと参照の違いとは?初心者向けにわかりやすく解説
C++には「参照(リファレンス)」と「ポインタ」という、どちらも間接的に変数を扱うための仕組みがあります。一見似ているこの2つですが、動作や使い方には重要な違いがあります。本記事では、それぞれの基本概念と構文を紹介したうえで、両者の主な相違点をわかりやすく解説します。 参照(Reference)とは 変数を参照として宣言すると、その参照は既に存在する変数の「別名(エイリアス)」として機能します。参照は元の変数と同じメモリ領域を共有するため、参照を通じて行った変更はすべて元の変数に直接反映されます。 構文 型 &新しい名前 = 既存の変数名; 初期化 int x = 10; int &a
-
C++にrestrict(制限)修飾子は存在しない?その理由と最適化への活用方法
C++の言語仕様に「restrict」キーワードはない結論から言うと、C++には「restrict」というキーワードは存在しません。C++の予約語(キーワード)の一覧は、C++言語規格のセクション2.11/1に定義されていますが、そこにrestrictは含まれていません。restrictはC99で導入されたC言語のキーワードであり、C++の標準規格には採用されていないのです。restrict修飾子とは何かC言語において、restrict修飾されたポインタ(または参照)とは、コンパイラに対する一種の「約束」です。具体的には、そのポインタが有効なスコープ内では、ポインタが指す対象のオブジェクトには