C++における「&」記号の使い方とは?ビットAND演算子とアドレス演算子を徹底解説
C++において「&」記号は演算子として使用されます。その用途は主に2つあり、1つはビット単位のAND演算子、もう1つは変数のアドレスを取得するアドレス演算子です。それぞれの役割と具体的な使い方を、サンプルコードとともに見ていきましょう。
ビット単位のAND(Bitwise AND)
ビット単位のAND演算子(&)は、第1オペランドの各ビットと第2オペランドの対応するビットを比較します。両方のビットが1の場合のみ結果のビットが1に設定され、それ以外の場合は0になります。なお、この演算子の両オペランドは整数型である必要があります。
コード例
#include <iostream>
using namespace std;
int main() {
unsigned short a = 0x5555; // 0101 ... のパターン
unsigned short b = 0xAAAA; // 1010 ... のパターン
cout << hex << ( a & b ) << endl;
}
実行結果
上記のコードを実行すると、以下の出力が得られます。
0
この例では、aの各ビット(0101...)とbの各ビット(1010...)が互いに補完関係にあるため、対応するビットが同時に1になる箇所が存在せず、結果は0となります。
アドレス演算子(Address Of Operator)
C++には、アドレス演算子(&)と間接参照演算子(*)という2つのポインタ関連の演算子が用意されています。
ポインタとは、別の変数のアドレスを格納する変数のことです。つまり、他の変数のアドレスを保持している変数は、「その変数を指し示す(ポイントする)」と言われます。対象となる変数は、オブジェクトや構造体、さらにはポインタ自体を含む任意のデータ型が可能です。
アドレス演算子(&)は、間接参照演算子(*)と対になる存在です。これは単項演算子であり、オペランドで指定した変数のメモリアドレスを返します。例えば、以下のように使用します。
コード例
#include <iostream>
using namespace std;
int main () {
int var;
int *ptr;
int val;
var = 3000;
// varのアドレスを取得してptrに代入
ptr = &var;
// ptrが指す先の値を取得
val = *ptr;
cout << "Value of var :" << var << endl;
cout << "Value of ptr :" << ptr << endl;
cout << "Value of val :" << val << endl;
return 0;
}
実行結果
上記のコードをコンパイルして実行すると、以下のような結果が出力されます。
Value of var :3000 Value of ptr :0xbff64494 Value of val :3000
ここで注目すべき点は、ptr = &var;によってvarのアドレスを取得し、次に*ptrでそのアドレスが指す先の値を取り出していることです。このように「&」と「*」は互いに逆の操作を行う、対照的な演算子となっています。
補足:参照型としての「&」
さらに、C++では「&」は参照(リファレンス)の宣言にも使われます。例えば int& ref = var; のように記述すると、refはvarの別名(エイリアス)として動作します。関数の引数を値渡しから参照渡しに変更したい場合などによく利用されるため、併せて覚えておくと良いでしょう。
-
10.0.0.1とは?プライベートIPアドレスの意味とログイン方法・トラブル対処法
10.0.0.1は、クライアントデバイスに割り当てられたり、ネットワーク機器のデフォルトIPアドレスとして設定されたりする、プライベートIPアドレスです。 10.0.0.1とは? 10.0.0.1は、家庭向けネットワークよりも企業向けコンピューターネットワークでよく見られるIPアドレスです。家庭用ルーターでは通常、192.168.1.1や192.168.0.1など、192.168.x.x系のアドレスが使われます。ただし、家庭内のデバイスに10.0.0.1が割り当てられることもあり、その場合も他のIPアドレスとまったく同じように機能します。 クライアントデバイスが10.0.0.xの範囲(例:1
-
C#のsizeof演算子とは?データ型のサイズを取得する方法
C#のsizeof()演算子は、指定したデータ型が占めるサイズ(バイト数)を返します。組み込みの値型に対して使用でき、メモリ管理やパフォーマンスの最適化を行う際に役立ちます。例えば、int型のサイズを調べたい場合は次のように記述します。sizeof(int);double型の場合は以下のとおりです。sizeof(double);サンプルコードそれでは、さまざまなデータ型のサイズを実際に確認できる完全な例を見てみましょう。using System; namespace Demo { class Program { static void Main(string[]