第7講 ポインタの学習
第10話 配列のアドレスを返す
g

を関数側配列データを作り、
配列の先頭アドレスを戻り値にして受け取り
mainで利用するプログラム例
#include<iostream>
#include <stdlib.h>
using namespace std;
int **f();
void main(){
   int i,j;
   int **y;
   y=f();
   for(i=0;i<10;i++){
     for(j=0;j<10;j++){
        if(y[i][j]<10)cout<<"00"<<y[i][j]<<" ";
        if(y[i][j]<100 && y[i][j]>=10)cout<<"0"<<y[i][j]<<" ";
        if(y[i][j]>=100)cout<<y[i][j]<<" ";
     }
     cout<<endl;
   }
}
int **f(){
   int i,j;
   int **x=(int **)malloc(sizeof(int
*)*10); //2016/12/27に間違いを訂正
   for(i=0;i<10;i++)x[i]=(int *)malloc(sizeof(int)*10);
   for(i=0;i<10;i++){
     for(j=0;j<10;j++){
        x[i][j]=10*i+j+1;
     }
   }
   return(x);
}

このプログラムを見て、
結局main側でも2次元配列に相当するものを
宣言しているので意味がないと感じる方もいらっしゃるでしょう。
ですが、実は意味があるのですよ。
今まで、mallocでメモリー領域を確保してそのままにしていましたが、
不要になったらメモリー領域は解放した方がよいのです。
例えば、100次魔方陣生成ソフトを作るとにには、
膨大なメモリーを必要とします。
現在のコンピュータは、
非常に大きな半導体メモリーを積んでいるとはいえ、
不要になった配列のメモリーを解放しないでそのままにすると、
メモリーを圧迫することになります。

不要になったメモリーを解放するには、
free(y);とすればよいのです。
#include<iostream>
using namespace std;
int **f();
void main(){
   int i,j;
   int **y=(int **)malloc(sizeof(int)*10);
   for(i=0;i<10;i++)y[i]=(int *)malloc(sizeof(int)*10);
      ・
      ・
      ・
   free(y);  
//これからは必ずメモリーの解放を行いましょう!
      ・
      ・
      ・
}
とすると、
n
(int **y=(int **)malloc(sizeof(int)*10);は間違っています。
正しくは、int **y=(int **)malloc(sizeof(int
*)*10); //2016/12/27に間違いを訂正

赤い囲いのみで、メモリーが利用され、
それ以外ではメモリーを使用せずメモリーの節約ができるのです。


関数も変数と同様にメモリー上で働きます。
変数や関数などの役者が、
踊ったり演じたりする舞台がメモリーです。
実は、関数は呼び出されるまでメモリー上に存在しません。
呼び出され任務を遂行している間だけ舞台に立つのです。
呼び出されるとは、mainなどに仕事を命じられることです。
関数は、呼び出される前はどこにも存在していません。
ですから、呼び出されなければ、
関数上で変数・配列・ポインタが宣言されていても、
それらの変数などのためのメモリーは存在しません。
呼び出され、
宣言されている行に達したときにはじめてメモリーの確保が行われ、
任務が遂行し終わると関数自体が消えてしまいますので、
関数の中で使われていた変数も消滅するのです。
関数の中で使われている変数に当てられていたメモリー領域が、
自動的に解放されるのです。
このように生成消滅を繰り返す関数と変数を
それぞれ動的関数、動的変数といいます。
mallocを使ってメモリーを確保しない変数は、
すべて動的変数です。



グローバル変数はなるべく使わない方よい理由は、
グローバル変数の場合は、プログラムが作動している間、
グローバル変数用のメモリーが常時割り当てられてしまうからです。
必要なときにだけ、
メモリーを確保して、終わったら解放し、必要になったらメモリーを確保する・・・
これは、必要な書類だけ机の上に出して、
仕事をして、その仕事が終わったらその書類は片付け、
次の仕事の書類を出して仕事を継続することと同じです。
グロバール変数は、常に机の一画を占めて、
仕事の空間が制約されて邪魔になります。
ですから、グローバル変数はなるべく使用しないで、
関数の中でmallocを使いメモリーを確保したときにも、
freeを使いメモリーを節約する習慣を身につけましょう。
グロバール変数が常にメモリー上に常駐して、
メモリーを使い続けるのと同様に、
mallocでメモリーを確保した場合は、
関数が消滅しても、メモリーが破棄されず使い続けられるからです。




さて、これで第7講は終了とします。
第8講では、配列・ポインタ・if文・for文を総動員して、
3次魔方陣の自動生成に挑戦することにしましょう。



第9話へ 第8講第1話へ

a

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