【C++】変数とポインタとアスタリスクとアンバーサンド

C++ コンピュータ
C++

C言語にはポインタという機能があり、C++も同様に使えたような記憶があります。

使い方を確認してみたいと思います。

普通の変数の値をコンソールに出力

#include <iostream>

int main() {
    int i = 5;
    std::cout << i << std::endl;
    return 0;
}
/*
結果
5
*/

int i = 5
int型の変数iを宣言し5で初期化(変数へ代入される)しています。

std::cout << i << std::endl;
標準出力にiの値を出力します。結果5が出力されます。

ポインタ変数を使い値をコンソールに出力

#include <iostream>

int main() {
    int i = 5;
    int* p;
    p = &i;
    std::cout << *p << std::endl;
    return 0;
}
/*
結果
5
*/

int* p;
int*はint型のポインタ変数pを宣言しています。

ポインタはメインメモリーのアドレスを表し、変数型の後に*(アスタリスク)をつけることで変数型のポインタを保持する変数であることを表します。

通常の変数からポインタを取得する方法として変数の前に&(アンバーサンド)をつけます。
p = &i;

変数の宣言と初期化がセットになっていないと気持ち悪いので一行にまとめると次の様になります。
int* p = &i;

ポインタ変数から値を取得する場合、ポインタ変数の前に*(アスタリスク)をつけます。
std::cout << *p << std::endl;

ポインタの使いどころ

関数の引数によく使われます。理由として引数として渡すデータ量がポインタ変数の大きさ分ですみます。
巨大な配列や複雑なクラスのオブジェクトだったとしても、int型の数値だったとしてもポインタ変数のサイズは概ね同じになります。

ポインタを関数の引数とした場合、他所で定義した変数を自由に書き換えてしまえるので、危険をはらみますが使い方さえ誤らなければパワフルな機能だと言えます。

ポインタがメモリのアドレスだとすると、メモリ上にある変数だけではなく関数のアドレスを取得することも出来ます。他言語のデリゲートのような使い方が出来そうです。(関数ポインタもデリゲートもあまり使ったことが無いので誤りかもしれません)

感想

C++としていますが今回の記事の内容はC言語の知識を思い出して書いています。

現代のC++では今回扱ったポインタを安全に扱うための仕掛けが用意されているようなので、そちらはそのうち勉強したいと思います。

コメント