はじめに
今回は最近C言語の授業で習ったポインタという概念について書いていこうと思います。
ポインタを習う前の私
まず,2つの整数値を入れ替える関数をつかったプログラムを次のように考えてみた。
#include<stdio.h>
void swap(int x, int y){ /*2つの整数を入れ替える関数*/
int temp = x;
x = y;
y = temp;
}
int main(void){
int a, b;
printf("整数Aを入力してください:");
scanf("%d", &a); /*変数Aの値をキーボードから取得*/
printf("整数Bを入力してください:");
scanf("%d", &b); /*変数Bの値をキーボードから取得*/
swap(a, b);
printf("整数Aと整数Bの値を入れ替えました\n");
printf("整数A:%d\n", a);
printf("整数B:%d", b);
return 0;
}
ダメだった理由
結論から言うと値渡しによる引数の受渡しが一方通行だからです。どういうことかというと, main関数から関数swapを呼び出す際に渡されるのが, 実引数a,bの値であって仮引数はコピーにすぎないのです。つまり, 関数の中で仮引数のx, yを変更したとしても, オリジナルのa, bの値に影響は及ばないのです。じゃあ,交換した値をreturn
で関数swapに返却させればよいのではと思うかもしれませんが, 関数は2個以上の値を返却することができません。
ここで便利なのがポインタなのです。
ポインタとは?
変数をデータを入れる箱と考えると, ポインタは箱のアドレスを入れる箱のことです。アドレスとはどこに格納されているのかという場所を表します。
ポインタを使うためには,ある変数のアドレスを求めるアドレス演算子&
,アドレスを保持するための変数であるポインタ変数*
という二つの記号を主に使います。
ex)
int x=0, y=0;
int *p; /*ポインタ変数*pを宣言*/
p = &x; /*xのアドレスを*pに代入*/
*P = 10; /**pに格納されているxの値を10に更新*/
y = *P; /*yに*pに格納されているxの値を代入*/
ポインタを使ってリベンジ
2つの整数値を入れ替える関数をつかったプログラムをポインタを使って修正すると,
#include<stdio.h>
void swap(int *x, int *y){ /*2つの整数を入れ替える関数*/
int temp = *x;
*x = *y;
*y = temp;
}
int main(void){
int a, b;
printf("整数Aを入力してください:");
scanf("%d", &a); /*変数Aの値をキーボードから取得*/
printf("整数Bを入力してください:");
scanf("%d", &b); /*変数Bの値をキーボードから取得*/
swap(&a, &b);
printf("整数Aと整数Bの値を入れ替えました\n");
printf("整数A:%d\n", a);
printf("整数B:%d", b);
return 0;
}
おわりに
今回はポインタという概念の初歩的なことについて書いていきました。
初めての記事で読みにくかったかもしれませんが, 最後まで見ていただきありがとうございました!