身につくC言語-17回目 ポインタとは その2-

 

ポインタの具体的な使用方法を解説していきたいと思います。

 

おさらいとして、こちらのコードを再度作成していきましょう。


#include<stdio.h>
int main(void)
{
	int a;
	int *b;
	
	printf("aのアドレスは%pです。\n",&a);
	
	b=&a;
	
	printf("ポインタbの値は%pです。\n",b);
	
	return 0;
}

aのアドレスをポインタbにと関係を持たせています。 なので、どちらも同じ結果になります。

ポインタの実用的な使い方

 

では今度は、実際の数字を変数の中に入れてやって見ましょう。


#include<stdio.h>
int main(void)
{
	int a=3;
	int *b;
	
	printf("aのアドレスは%p、値は%dです。\n",&a,a);
	
	b=&a;
	
	printf("bの値は%pで、値は%dです。\n",b,*b);
	
	return 0;
}

 

ここでは、「ポインタから値を見つける」ということを主旨においています。

 

一番見てほしいのは、

 

printf(“bの値は%pで、値は%dです。\n”,b,*b);

 

というところです。

 

値は、「*b」という形で、表すことができます。

 

表示は「%d」です。

 

「b」と「*b」は別ものだということを覚えておいてください。

 

関数の引数をポインタで宣言する

 

まず、関数の引数とは

 


int main(void)


返り値 関数名(引数)

 

ということです。

 

なぜ関数の引数をポインタでする必要があるのか

 

結論から言うと、

 

returnでは1つの要素しか、返り値として設定できないから

 

です。

 

二つ以上の値を戻す事ができないんですね。

 

ここでは、2つの値を返すということをしていきましょう。

 


ソースコード


#include<stdio.h>
void nibai(int *x,int *y);

int main(void)
{
	int a=2;
	int b=3;
	
	nibai(&a,&b);
	
	printf("2と3を2倍すると%dと%dです。\n",a,b);
	
	return 0;
}

void nibai(int *x,int *y)
{
	*x=*x*2;
	*y=*y*2;
}

 

これは難しいですね。

 

大事なところは、

 

  • nibai(&a,&b);
  • void nibai(int *x,int *y)

 

というところです。

 

nibai(&a,&b);について

 

これは、

 

引数にアドレスを使用している

 

ということがわかれば大丈夫です。

 

アドレスにすることによって、

 

ほかの関数で値を変更しても、returnを書かなくても値が引き継がれる

 

ことができます。

 

これは数をこなして覚えることが一番だと思います。

 

*x=*x*2;というのは、2倍して*xすなわち&aに代入しているということです。

 

練習問題

整数を3つ入力してsanbai関数ないで3倍し、main関数ないで出力するプログラムを作成せよ

練習問題解答


#include<stdio.h>
void sanbai(int *x,int *y,int *z);

int main(void)
{
	int a[3];
	int i;
	
	for(i=0;i<3;i++)
	{
		scanf("%d",&a[i]);
	}
	
	sanbai(&a[0],&a[1],&a[2]);
	
	for(i=0;i<3;i++)
	{
		printf("%d\n",a[i]);
	}
	
	return 0;
}

void sanbai(int *x,int *y,int *z)
{
	*x=*x*3;
	*y=*y*3;
	*z=*z*3;
}

 

この書き方だと、要素が3つになっても正常に動かすことができます。

 

まとめ

 

書き忘れていましたが、戻り値の「void」はreturn (返り値)がないので「void」と書いています。

 

引数にポインタを使うとより高度な事が関数を使ってできるようになります。