ポインタを使って値を変更する
「int *p = &i」と書くと、pはポインタ変数であり、変数iのアドレスを代入している。そして、*pは変数iの別名としてふるまう。
つまり、ポインタを使って、変数の値を変更できるようになる。
#include <stdio.h>
int main(void)
{
int i = 5;
int *p = &i;
int j = *p;
printf("jの値は%d\n",j);
*p = 10;
printf("iの値は%d\n",i);
}
実行結果は次の通りである。
jの値は5
iの値は10
ポインタが指す先を変更する
このように、「int *p = &i」と書くとポインタ変数pに変数iのアドレスが代入された。同様に「p = &j」とすれば、別の変数jのアドレスがpに代入される。ポインタ変数pの指す先が変わったのである。
#include <stdio.h>
int main(void)
{
int i = 5;
int j= 10;
int *p = &i;
printf("*pの値は%d\n",*p);
p = &j;
printf("*pの値は%d\n",*p);
}
実行結果は次の通りである。
*pの値は5
*pの値は10
ポインタを引数とする関数
本ブログでは、以前に「関数」を取り上げた。C言語の基礎(関数)
そこで、「値渡しと参照渡し」について簡単に説明している。ここでは、もう少しみていこう。
#include <stdio.h>
void func(int i)
{
i += 5;
printf("func関数内のiの値は%d\n",i);
}
int main(void)
{
int i = 5;
int *p = &i;
printf("func関数を呼び出す前のiの値は%d\n",i);
func(i);
printf("func関数を呼び出した後のiの値は%d\n",i);
}
実行結果は次の通りである。
func関数を呼び出す前のiの値は5
func関数内のiの値は10
func関数を呼び出した後のiの値は5
下図の通り、func関数の中で変数iの値を変更しても呼び出し元のmain関数の変数iの値には何の影響の与えない。
関数の引数にポインタ変数を使って、アドレスを受け渡すことで解決できる。
#include <stdio.h>
void func(int *p)
{
*p += 5;
printf("func関数内の*pの値は%d\n",*p);
}
int main(void)
{
int i = 5;
printf("func関数を呼び出す前のiの値は%d\n",i);
func(&i);
printf("func関数を呼び出した後のiの値は%d\n",i);
}
実行結果は次の通りである。
func関数を呼び出す前のiの値は5
func関数内の*pの値は10
func関数を呼び出した後のiの値は10
このように、関数にアドレスを渡すことで、そのアドレスに格納されている値を、関数の中で変更できる。
(参考文献)C言語 新版: ゼロからはじめるプログラミング(三谷純著・翔泳社 (2022/9/1))、スッキリわかるC言語入門 第2版(中山 清喬 (著)・ インプレス; 第2版 (2021/12/14))
コメント