第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++ 入門 初心者 基礎から応用まで
本サイトトップへ