4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

watnowAdvent Calendar 2022

Day 15

代入がうまくいかない理由とポインタによる解決

Posted at

はじめに

今回は最近C言語の授業で習ったポインタという概念について書いていこうと思います。

ポインタを習う前の私

まず,2つの整数値を入れ替える関数をつかったプログラムを次のように考えてみた。

swap.c
#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;
}

これを実行してみると、、、スクリーンショット_20221215_180138.png
あれ?なんで変わってないの?

ダメだった理由

結論から言うと値渡しによる引数の受渡しが一方通行だからです。どういうことかというと, main関数から関数swapを呼び出す際に渡されるのが, 実引数a,bの値であって仮引数はコピーにすぎないのです。つまり, 関数の中で仮引数のx, yを変更したとしても, オリジナルのa, bの値に影響は及ばないのです。じゃあ,交換した値をreturnで関数swapに返却させればよいのではと思うかもしれませんが, 関数は2個以上の値を返却することができません。
ここで便利なのがポインタなのです。

ポインタとは?

変数をデータを入れる箱と考えると, ポインタは箱のアドレスを入れる箱のことです。アドレスとはどこに格納されているのかという場所を表します。
ポインタを使うためには,ある変数のアドレスを求めるアドレス演算子&,アドレスを保持するための変数であるポインタ変数*という二つの記号を主に使います。
ex)

list1.c
int x=0, y=0;
int *p;  /*ポインタ変数*pを宣言*/
p = &x;  /*xのアドレスを*pに代入*/
*P = 10; /**pに格納されているxの値を10に更新*/
y = *P;  /*yに*pに格納されているxの値を代入*/

ポインタを使ってリベンジ

2つの整数値を入れ替える関数をつかったプログラムをポインタを使って修正すると,

swap2.c
#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;
}

これを実行してみると、、、スクリーンショット_20221215_191038.png
今回はうまくいきましたね!

おわりに

今回はポインタという概念の初歩的なことについて書いていきました。
初めての記事で読みにくかったかもしれませんが, 最後まで見ていただきありがとうございました!

4
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?