C言語の基礎(ポインタの活用)

スポンサーリンク
C言語

ポインタを使って値を変更する

「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))

コメント

タイトルとURLをコピーしました