C言語のポインタの概念について解説します
筆者が初めてポインタと遭遇したのが、swap関数でした
そこで、swap関数を題材に説明していきます 下記がコードです
void swap(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;}
int main(void){
swap(&a, &b);
return 0;
}
これを初めて見た時に、 戻り値が、void となっているのであれば、何も処理されないのでは? と思いました。
ところが実際にこのコードを実行すると、ちゃんと swapされます
まず、int *a;
とは何者であるかを見ていきましょう
int *a;
で宣言された a
とは、一般的に「int型の変数を指すポインタ」 と説明されます
この「int型の変数を指す」であったり、「ポインタ」というものが曲者です
ここをもう少し詳しく見ていきます
一旦、一般的な変数の宣言(非ポインタ)を見ていきましょう
int x; x = 1; int x;
で宣言された x
は、int型の変数で、その変数に格納されている値は、1
です
変数は箱で、その箱の中に格納されているのが値 というイメージです
これはわかりやすいと思います
再び、int *a;
に戻りましょう
int *a;
で宣言された a
は、「int型の変数」ではなく、int型の変数が保存された場所です
例えば、デスクトップ上に、新しいファイルを作成すると、C:\Users\nobby\desktop\新規テキストドキュメント.txt というパスが与えられます。
職場などで、ファイルを受け渡す時に、ファイルそのものをメールに添付して送信する場合と、 ファイルが保存されている場所(パス)を、相手に伝える方法があります
swap(&a, &b);
とは、ファイルそのものではなく、ファイルが保存されている場所(パス)を相手に伝えているようなイメージです
元ファイルが保存されている場所が分かれば、そこへアクセスして書き換えることが可能になります
swap関数が実行していることは、まさに元ファイルを書き換えている作業となります
最後にまとめると
ポインタとは、変数が保存されている場所 です(PC上の作業では、ファイルの保存場所(パス)に相当します)
上記のswap関数では、変数の代わりに、変数が保存されている場所を引数として受け取っています
こうすることで、これらの変数が保存されている場所へアクセスして、これらの変数に格納されている値を書き換えています
コメント