第12講 ポインタを利用してテトリスからグローバル変数とグローバル配列を追放する!

第1話 変数のアドレスを送る
前講では、配列のアドレスを送るということをやり、
変数についてはやっていませんので、
変数のアドレスを送る例をやってから、
第12講の課題に入っていきたいと思います。
プロジェクトaまたはbを開きまして、
コードを次のように変更して下さい。
#include<stdio.h>
#include <stdlib.h>
int f(int *x);
int main(){
  int *x=(int *)malloc(sizeof(int));
  *x=5;
  printf("%dの2倍は%dです。\n",*x,f(x));
  return(0);
}
int f(int *x){
  return(2*(*x));
}
コピペ用添付ファイル
実行結果
5の2倍は10です。

  int *x=(int *)malloc(sizeof(int));
で2つの箱が同時に用意され、
*xのサイズがint型に設定されています。
2つの箱とは、整数を入れる箱*xと箱のアドレスを入れる箱xです。
  *x=5;
によって、*xという箱に5を入れています。
そして、
  printf("%dの2倍は%dです。\n",*x,
f(x));
のにf(x)よって、*xの箱の住所が社員f()に送られます。
社員f()はその住所のところに行って、
その箱の中身をコピー(参照)して、
2倍にして、社長main()に返しています。

このコードは次のようにも変更できます。
#include<stdio.h>
#include <stdlib.h>
void f(int *x);
int main(){
  int *x=(int *)malloc(sizeof(int));
  *x=5;
  printf("%dの2倍は",*x);
  f(x);
  printf("%dです。\n",*x);
  return(0);
}
void f(int *x){
  *x=2*(*x);
}
コピペ用添付ファイル
実行結果
5の2倍は10です。
今回は、社員f()は教えられた住所のところに行って、
*x箱の中身を参照(コピー)してそれを2倍してから、
改めて*xに入れ直しています。
これで箱の中身が10に入れ替わったのです。
今回こそが社長から箱の中身を変えることを依頼され、
それを実行したのです。
前のコードは箱の中身は変わっていないのに対して、
今回は入れ替わっています。

この講で練習のために、グローバル配列をいくつか選んで追放していきます。
できるだけ、グローバル変数は使わない!がC言語プログラミングの原則であるからです。
理由は、使っている間だけメモリに変数を置き、
使い終わったら変数を削除することによって、
メモリを節約するためです。
グローバル変数は、使っていようがいまいがメモリに常駐して、
メモリを無駄遣いしています。
追放するにはポインタを使います。

追放は、あくまでC言語の基礎を学ぶための練習ですから、
最後には第10講第11話の添付ファイルで元に戻します。
というのは、開発したテトリスでは、
常にグローバル変数を使っていますので、
動的変数
(今まで学んできたローカル変数は生成消滅を繰り返す変数です。
このように生成消滅を繰り返す変数を動的変数というのです。
同様に今まで学んできた関数も生成消滅を繰り返す動的関数です。
ローカル変数や関数でも、メモリに常駐させることもできます。
メモリに常駐させた変数を静的変数、
メモリに常駐させた関数を静的関数と言います。
宣言する際に、staticを冒頭に付け加えると静的となります。
静的変数や静的関数はマルチスレッド処理(並列処理)のときに必要となります。
マルチスレッドは後の講のテーマになります。)
に変更したところで、メリットはそれほどあるわけではないからです。





では、グローバル配列
int x,y;
をまずローカル変数に変更しましょう。
xは11以下の整数ですし、yは26以下の整数ですから、
この際にchar型に変更しましょう。
そして、ゲームプログラムの社長であるWINAPI WinMain()において、
ローカル変数
  //整数型の箱*xと*yを用意とそれぞれの箱の住所を入れる箱xとyを用意
  char *x=(char *)malloc(sizeof(int)),*y=(char *)malloc(sizeof(int));
を宣言しましょう。
社員のプロトタイプ宣言と内容で変更しなければならないのは、
xとyが使われている社員です。

では皆さん挑戦して下さい。
*x++;だと、アドレス操作の方が優先され*(x++);となってしまいますので、
(*x)++; とする必要がある点に注意して下さい。


第11講第12話へ   第2話へ

第2部目次に戻る  第1部目次に戻る

初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
ecliqse c++ 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
ecliqse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ