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

六日目 ポインタ3

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

HOME/小学生でもわかるC言語2 目次/六日目 ポインタ3/

広告

↓2016年02月29日発売↓

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

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

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

目次へ戻る

?と思ったら

わからなそうな用語集

ポインタ3

今回は配列とポインタの関係を見ていきましょう!

まずは配列の先頭部分のメモリアドレスをポインタに入れて、そこから何番目というように他の場所を指定してみます。

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

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

	printf("配列の先頭アドレス = %x\n",&hairetu[0]);
	printf("pに保存されたアドレス = %x\n",p);
	printf("先頭に保存されてる数字 = %d\n\n",*p);

	printf("配列番号2のアドレス = %x\n",&hairetu[2]);
	printf("p + 2 = %x\n",p + 2);
	printf("配列番号2の内容 = %d\n",hairetu[2]);
	printf("*(p + 2) = %d\n",*(p + 2));

	return 0;
}

■実行結果■

実行結果(e-6-1)

ポインタを使って、間接的に他の配列番号の内容を確認します。

int hairetu[5] = {10,9,8,7,6};

こちらの配列の先頭部分のアドレスをポインタに保存します。

int *p;	
p = &hairetu[0];

ポインタを宣言する時は変数の頭に「*」アスタリスクですね。

そしてアドレスを使う時は頭に「&」アンパサンドでした。

先頭部分のアドレスなので「&hairetu[0]」ですね。

では次にそのポインタのアドレスを計算して、他の配列番号の内容を確認してみます!

先頭アドレスから「+何番目?」というような感じで計算します。

「p + 0」だと先頭アドレス

「p + 1」だと「hairetu[1]」のアドレス

「p + 2」だと「hairetu[2]」のアドレス

こんな感じで計算します。

そして頭に「*」アスタリスクをつければ内容を確認できるので

*(p + 2) = 8;

こんな感じですね。

ちなみに、このかっこを外してこうしてみると

*p + 2 = 12;

ポインタ変数「p」の内容の方にたし算してしまうので注意しましょう。

何度も言いますが、

アドレス→「p」

内容→「*p」

です。

とにかく覚えましょう。

ややこしい例

*p++ ・・・この場合はアドレスを先にずらして内容を確認してます!

(*p)++ ・・・これは内容に1を足してます!

こういうややこしい場合は計算を分けたり、()かっこをつけて計算の順番を守ったりしましょう。

話ついでに内容の方も間接的にいじってみたプログラムです。

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

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

	printf("配列番号2のアドレス = %x\n",&hairetu[2]);
	printf("p + 2 = %x\n\n",p + 2);

	printf("配列番号2の内容 = %d\n",hairetu[2]);
	printf("保存されてる内容に+2 = %d\n",*(p + 2) + 2);

	return 0;
}

■実行結果■

実行結果(e-6-2)

こんな感じになりますね。

気を付けて!

さきほどのプログラムで例えば、

*(p + 10) = 100;

とすれば先頭アドレスから10番目の場所が「100」になりますよね。

でもプログラム中では、5番目までは配列で宣言したけど、それ以上はしてません。

そこには

「ウインドウズがシステム管理の為に使っている超大事な数字」

があったりします。

なのでこの部分を大丈夫、大丈夫と好きかってにいじったりすると、データが破壊されたり、最悪PCが起動不能になったりもするので

ぜったいにやってはいけません!!!

まあ最近のコンパイラやPCなどはエラー対策をしていたりするそうですが、念のため!やめておきましょう!

何か変だよ、アドレス計算

一つ目のプログラムの実行結果をもう一度見てください。

先頭アドレスp = 39fe30
配列番号2番目のアドレス = 39fe38

ここに疑問を感じた方は16進数をきちんと理解していますね!

そうじゃない方は16進数恐怖症・・・。かな・・・。

つまりは、16進数といっても数字の進みは一緒なので、

p = 39fe30;
p + 2 = 39fe32;

とならなきゃ何か変だよ!となるワケです!

これははるか昔に習った

数字を使う時は「int」

文字を使う時は「char」

という変数を宣言する時のアレの事をもう少し知る必要があります!

「int」や「char」の話

こちらのサイトでは

数字専用が「int」

文字専用が「char」

というように紹介したと思います。

実はですね。特に専用ではなく、例えば「int」だったら

「メモリ4つ分の場所を使いますよ!」

というように、使う場所の大きさを指定していたのです!

それで「int」は「4つ分メモリ」、この大きさでポインタ変数も宣言しているので

int *p;
p = 39fe30;
p + 1 = 39fe34;
p + 2 = 39fe38;

のように4つとびに進んでいたのです!

ちなみにこの中の「39fe31」の内容を知りたい欲求にかられる方、いるかもしれませんが、それは

合体ロボのそれぞれのパーツに分かれる部分じゃないトコロを無理やりむしりとる

ような事なのでやめましょう。

下手をすればデータが破壊されます。

注意

さきほどの「「int」の場合はメモリ4つ分」は使うコンパイラによって、変わる場合があります。メモリ2つ分とるコンパイラもあります!

C言語をみんなが使えるように、規則を決めましょう!と昔やっていた頃にごちゃごちゃっとなって、こんな統一感がない事になったらしいのですが・・・。

こういうもんだと覚えましょう!

「char」の場合はほとんどのコンパイラでメモリ1つ分が用意されます!

なぜに文字の方が小さいのかというような理由は。話せば長いので

こういうもんだと覚えましょう!

ポインタ演算

今回やったアドレスの計算の事をポインタ演算っていいます。

これをやっていいのは足し算か引き算だけです。

かけ算やわり算は使ってはいけません。

では少し話が長くなってきたので続きは次回にしたいと思います!

次回

七日目 ポインタ4

□ページの先頭へ□

□目次へ戻る□

広告

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