C言語 入門 小学生でもわかるC言語2

八日目 ポインタまとめ

「わかりやすく!」がテーマです!

HOME/小学生でもわかるC言語2 目次/八日目 ポインタまとめ/

広告

↓2016年02月29日発売↓

12歳からはじめる ゼロからのC言語 ゲームプログラミング教室

新品価格
¥2,462から
(2016/5/10 22:16時点)

もっと!C、C++言語本

目次へ戻る

?と思ったら

わからなそうな用語集

ポインタまとめ

今回はポインタまとめとして少しマトモ?な使い方を見ていきましょう!

グローバル変数のように使う

/*プログラム24*/
#include <stdio.h>

void func(int *);

int main(){
	int suji = 10;

	printf("関数「func」の前 = %d\n",suji);

	func(&suji);

	printf("関数「func」の後 = %d\n",suji);

	return 0;
}

void func(int *suji){
	*suji = 100;
}

■実行結果■

実行結果(e-8-1)

今までと違ってアドレスを渡す事によって、グローバル変数のように使うことができます。

関数「func」のプロトタイプ宣言から見ていきましょう。

void func(int *);

アドレスを渡す時は「*」アスタリスクをつけます。

次に「int main()」内を見てみましょう。

func(&suji);

ここで関数「func」に変数「suji」のアドレスを渡してます!「&」アンパサンドがつく所に注意です!

では関数「func」の内容を見てみましょう!

void func(int *suji){
	*suji = 100;
}

「*」アスタリスクをつける以外は通常の変数の場合と同じですね!

これでメモリアドレスの方から変数「suji」を直接いじれるので元の値も変更できるようになります。

この方法はあとで紹介する「構造体(こうぞうたい)」と合わせてよく使われるので覚えておきましょう!

注意

さきほどの関数「func」内の変数「*suji」はポインタ変数です。

関数「func」内で

suji = 100;

と「*」アスタリスクをつけないで書いてしまうと他のアドレスをいじる事になりプログラムが暴走してしまうかもしれないので気を付けましょう。

グローバル変数のように使う(配列)

/*プログラム25*/
#include <stdio.h>

void func(int *);

int main(){
	int suji[3] = {1,3,5};
	int i;

	for(i=0;i<3;i++){
		printf("関数「func」前のsuji[%d] = %d\n",i,suji[i]);
	}

	func(suji);
	printf("\n");

	for(i=0;i<3;i++){
		printf("関数「func」後のsuji[%d] = %d\n",i,suji[i]);
	}

	return 0;
}

void func(int *suji){
	int i;
	for(i=0;i<3;i++){
		*(suji + i) = *(suji + i) + 1;
	}
}

■実行結果■

実行結果(e-8-2)

今度は配列のアドレスを渡してみます!

まずはプロトタイプ宣言を見てみましょう!

void func(int *);

ここは変わらずですね。アドレスを渡すので頭に「*」アスタリスクをつけます。

void func(int *suji);

関数「func」本体の部分も変わりありません。

void func(int *suji[3]);

とかになる気もしますが配列の[3]はなくて大丈夫です。

続いて「int main()」内を見てみましょう!

配列を宣言して、内容を関数「for」で表示してから、いよいよ関数「func」に配列のアドレスを渡します。

func(suji);

「&」はいりません!注意です!

配列番号を指定しないで、配列名だけの場合はアドレスを表すのです!!!

今まで使ってきた

printf("%s",hairetu);

この意味はアドレスを表していたんですね!

では戻って関数「func」本体を見てみましょう!

*(suji + i) = *(suji + i) + 1;

この計算の意味は先に()カッコの中身で、アドレスの位置を進めてから、その内容に「+1」してます!

ポインタなんてうんざりだ!

suji = fa4
&suji[0] = fa4
&suji = fa4

さきほどのプログラムの配列「suji」のアドレスをいろいろ調べてみました。

全て同じです。

しかしながらですね、他の関数にアドレス渡す時に

func(&suji);

これはたぶんエラーになります。

「なぜなのか?」

思ってしまうトコロですが、

ここでいちいち気になってしまうとポインタの勉強だけでC言語が終わってしまうので

「そーゆーものだ」

と気にせずにいきましょう!

ポインタ計算

今までは配列の先頭のアドレスから配列の他の場所の値を見たりしてました。

今度はアドレスそのものを動かして、配列の他の場所の値を見たり変更したりしてみます。

/*プログラム26*/
#include <stdio.h>

int main(){
	int hairetu[10] = {1,2,3,4,5,6,7,8,9,0};
	int *p;

	p = hairetu;

	printf("hairetu[0] = %x\n",&hairetu[0]);
	printf("p = %x\n",p);

	printf("\n");

	while(*p){
		printf("%d ",*(p++));
	}

	printf("\n\n");

	printf("hairetu[9] = %x\n",&hairetu[9]);
	printf("p = %x\n",p);

	return 0;
}

■実行結果■

実行結果(e-8-3)

配列「hairetu」の内容を表示するプログラムです。

ポインタ変数「p」が保存しているアドレスに注目すると

2cfb40

2cfb64

16進数でわかりづらいかもしれませんが、アドレスを直接進めているのが確認できますね!

ではwhile命令の()カッコ内を見てみましょう!

while(*p);

ポインタ変数の内容を知りたい場合は頭に「*」アスタリスクですね!

そして関数「while」などの条件が「0」になると終了というものを覚えておりますでしょうか?

int hairetu[10] = {1,2,3,4,5,6,7,8,9,0};

配列の内容にわざと終了条件である「0」を入れます。

それで最初に配列「hairetu」の先頭アドレスを入れたポインタ変数「p」のアドレスを進めて終了条件「0」へと進めていきます。

printf("%d ",*(p++));

「p++」でアドレスをずらした後に「*」アスタリスクをつけて内容を表示します。

「p++」と「++p」

「p++」

先に内容を表示してからアドレスを進めます。

「++p」

先にアドレスを進めてから内容を表示します。

この違いに注意です!

元アドレスは動かせない

さきほどのプログラム26で配列のアドレスを直接選んで

hairetu++;

printf(&%d &,hairetu[0]);

みたいな事をしようとするとエラーになります。

元のアドレスは動かす事ができないのです!

気をつけて!

/*プログラム27*/
#include <stdio.h>

void func(int *);

int main(){
	int hairetu[3] = {10,11,12};
	int *p;

	p = hairetu;

	printf("mainのp = %x\n",p);

	func(p);

	printf("mainのp = %x\n",p);

	

	return 0;
}

void func(int *p){
	p++;
	printf("funcのp = %x\n",p);
}

■実行結果■

実行結果(e-8-4)

これはやってしまいそうなミスになります。

関数「func」にアドレス渡して一つ進めたハズなのに「int main」でもとのアドレスに戻っている。

「なぜなのか?」

関数の時にやった数字や文字を他の関数と受け渡しを思い出せばナゾは解けますね!

関数「func」の方にある「p」は関数「func」で宣言したローカル変数ってことですね!

なので関数「func」が終わってしまうと関数「func」内の「p」も消えてしまうのです。

アドレスを使うと感覚としてアドレスは絶対動かない!みたいに感じてしまう事もあるのですが、

ポインタも変数の一つなので普通の変数と同じルールになるのです!

まだ続きます!

まとめきれませんでした・・・。

長くなってきたので、また次回にしようかと思います。

次回

九日目 ポインタまとめ2

□ページの先頭へ□

□目次へ戻る□

広告

↓2014年06月20日発売↓

14歳からはじめるC言語わくわくゲームプログラミング教室 Visual Studio 2013編

新品価格
¥2,500から
(2016/5/10 22:17時点)

↓2014年10月25日発売↓

超本格! サンプルで覚えるC言語 3Dゲームプログラミング教室

新品価格
¥3,110から
(2016/5/10 22:18時点)

↓2013年07月25日発売↓

小学生からはじめるわくわくプログラミング

新品価格
¥2,052から
(2016/5/10 22:21時点)

↓2016年05月13日発売↓

小学生からはじめるわくわくプログラミング2

新品価格
¥2,052から
(2016/5/10 22:22時点)

もっと!C、C++言語本