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

九日目 ポインタまとめ2

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

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

広告

↓2016年02月29日発売↓

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

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

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

目次へ戻る

?と思ったら

わからなそうな用語集

ポインタまとめ2

それではポインタまとめその2いってみましょう!

気をつけて!その2

関数「func」の中で宣言した配列「hairetu」の先頭アドレスを「int main()」で受け取って表示するプログラムです。

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

char* func();

int main(){
	char *bunsyou = func();

	printf("%s\n",bunsyou);

	return 0;
}

char* func(){
	char hairetu[80] = "hello";
		
	return hairetu;
}

■実行結果■

実行結果(e-9-1)

おかしな実行結果になったと思います。

こちらもよくやってしまいそうなミスになります。

どうしても

「アドレスを直接いじってる!!!」

ってとこからアドレスは絶対に動かないみたいに感じてしまうのですが、ポインタも変数の一つなので

char* func(){
	char hairetu[80] = "hello";
		
	return hairetu;
}

この関数「func」の中で宣言した配列「hairetu」は関数「func」が終わる時になくなってしまうのです。

いわゆるローカル変数と同じって事ですね!

使い慣れない時はよく使われてる方法そのままにポインタを使うようにしましょう!

文章を受け取る

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

char* func(char *);

int main(){
	char hairetu[80];
	char *bunsyou = func(hairetu);

	printf("%s\n",bunsyou);

	return 0;
}

char* func(char *hairetu_p){
	hairetu_p[0] = 'h';
	hairetu_p[1] = 'e';
	hairetu_p[2] = 'l';
	hairetu_p[3] = 'l';
	hairetu_p[4] = 'o';
	hairetu_p[5] = 0;
		
	return hairetu_p;
}

■実行結果■

実行結果(e-9-2)

プログラム28を少し変えたものです。

ポインタの事を知るために、ちょっとめんどくさい方法で「hello」と文章を入れてますが、

もっとやりやすい方法もありますのでご安心ください。

ポインタとして関数「func」で先頭アドレスを受け取っただけですが、配列のように添え字を指定して使えます。

前回は関数「func」の中で宣言した配列「hairetu」のアドレスを「int main()」の方で受け取ってしまったので、上手くいきませんでした。

ある関数の中で宣言したローカル変数はその関数が終わると共になくなってしまうという事でしたね!

なのでスナオに「int main()」の中で宣言してあげればプログラム終了まで残るという事です。

文章を受け取る2

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

char* func(void);

int main(){
	char *bunsyou = func();

	printf("%s\n",bunsyou);

	return 0;
}

char* func(){
	return "this is a pen";
}

■実行結果■

実行結果(e-9-3)

直接、文章を受け取るプログラムです。

直接なので問題なく受け取る事ができます。

2次元配列とポインタ

ではここで2次元配列の登場です。

さきほどのプログラム29で1次元の配列は問題なくいけたので、

同じように受け取った先でも2次元配列番号で確認できれば便利ですね!

しかしながら、

できません・・・。

試しにやってみてください。エラーになります。

では渡した2次元配列はどうなっているのでしょうか?

少しずつ確認してみましょう!

先頭アドレス

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

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

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

	return 0;
}

■実行結果■

実行結果(e-9-4)

まずは先頭アドレスを確認してみました。

2次元配列になると別のものになっちゃうのかなーと思いましたが、

とりあえずは同じアドレスなので、ここまでは問題なさそうです。

2次元配列の中身

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

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

	int i,j;

	for(i=0;i<3;i++){
		for(j=0;j<3;j++){
			printf("&hairetu[%d][%d] = %x\n",
				i,j,&hairetu[i][j]);
		}
	}

	return 0;
}

■実行結果■

実行結果(e-9-5)

2次元配列のアドレスを表示させてみました。

16進数は覚えておりますでしょうか?

0123456789abcdef→10

16個目に2ケタになるあれですね。

「int」はアドレスを4つ分使います。(コンパイラによって少し違うかもです)

それを頭にいれつつ実行結果を確認してみましょう!

うん。

規則正しく並んでます。どういう事でしょう?

これはコンピューターにとっては、

2次元になってもアドレスの並びは変わらない!

という事です。たとえば

hairetu[3][3];

だったら3×3で9個のアドレスを用意するだけで、特に2次元らしく保存しているワケではないって事です。

でもこの規則正しい並びがわかっていれば、同じように2次元配列に結びつける事ができそうです!

2次元配列に結びつける

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

void func(int* );

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

	func(&hairetu[0][0]);

	printf("\n");

	return 0;
}

void func(int *p){
	int *hairetu[3][3];
	int i,j;

	for(i=0;i<3;i++){
		for(j=0;j<3;j++){
			hairetu[i][j] = p;
			p++;
			printf("%d ",*(hairetu[i][j]));
		}
	}	
}

■実行結果■

実行結果(e-9-6)

関数「func」の中で新しくポインタ変数で2次元を宣言

int *hairetu[3][3];

そしてこれにそれぞれのポインタを結びつけます。

「p」の中に先頭アドレスが入っているので、

hairetu[0][0] = p;
p++;

hairetu[0][1] = p;
p++;

hairetu[0][2] = p;

こんな感じで受け取ったアドレス「p」を一つずつ進めながら結びつけます。

そしてそれぞれを結びつけたら確認のため

printf("%d ",*(hairetu[i][j]));

で表示してみます!

hairetu[i][j];

だけだとアドレスを表示してしまうので先に()カッコの中でポインタを進めてから、

「*」アスタリスクをつけている所に注意です。

ポインタ終了

大変長らくお疲れ様でした!

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

という声が聞こえてきそうなので

なんとなくの使い方がわかったトコロで次に進みたいと思います。

次回

10日目 セットで一つ!構造体(こうぞうたい)!

□ページの先頭へ□

□目次へ戻る□

広告

↓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++言語本