第11講 ポインタの学習

第10話 配列のアドレスを返す
今回も簡単な事例を見て頂いてから、
説明することにしましょう。
#include<stdio.h>
#include<stdlib.h>
int** f(); //2次元配列を作り、配列に作成したランダムデータを収納させる社員
void g(int **x); //データを表示する社員
int main(){
  int **a; //社員fが作った2次元配列の受け皿
  a=f();
  g(a);
  return(0);
}
int** f(){
  int i,j;
  int **x=(int **)malloc(sizeof(int *)*5);
  for(i=0;i<5;i++)*(x+i)=(int *)malloc(sizeof(int)*4);
  for(i=0;i<5;i++){
    for(j=0;j<4;j++){
      x[i][j]=rand()%10;
    }
  }
  return(x);
}
void g(int **x){
  int i,j;
  for(i=0;i<5;i++){
    for(j=0;j<4;j++){
      printf("%d ",x[i][j]);
    }
    printf("\n");
  }
}
コピペ用添付ファイル
実行画面
1 7 4 0
9 4 8 8
2 4 5 5
1 7 1 1
5 2 7 6

今回、2次元配列を作成するのは社員fです。
社長mainは、その2次元配列の先頭アドレスを受け取る受け皿(受け箱)を
  int **a; //社員fが作った2次元配列の受け皿
で用意しています。
社員fは、ランダムデータを2次元配列に収納するという仕事をしてから、
社長mainに2次元配列の先頭アドレスを
  return(x);
によって返しています。
そして、社長mainは、
  g(a);
によって、データ表示社員にその先頭アドレスを送っています。
mainは受け皿を作らずに、
int main(){
  
g(f());
  return(0);
}
とすることも出来ます。
この場合の全文も載せておきましょう。
#include<stdio.h>
#include<stdlib.h>
int** f(); //2次元配列を作り、配列に作成したランダムデータを収納させる社員
void g(int **x); //データを表示する社員
int main(){
  g(f());
  return(0);
}
int** f(){
  int i,j;
  int **x=(int **)malloc(sizeof(int *)*5);
  for(i=0;i<5;i++)*(x+i)=(int *)malloc(sizeof(int)*4);
  for(i=0;i<5;i++){
    for(j=0;j<4;j++){
      x[i][j]=rand()%10;
    }
  }
  return(x);
}
void g(int **x){
  int i,j;
  for(i=0;i<5;i++){
    for(j=0;j<4;j++){
      printf("%d ",x[i][j]);
    }
    printf("\n");
  }
}

コピペ用添付ファイル

正確には、配列を送ったり配列を返したりはできません。
配列の先頭アドレスを送る方は、
配列の先頭アドレスを送る社員が自分専用の配列のある場所を教えて、
それを使う許可を与えているわけですし、
配列の先頭アドレスを返す方は、
配列の先頭アドレスを返す社員が自分専用の配列のある場所を教えて、
それを使う許可を与えているわけです。
ですが、でも表現(比喩)としては、
『配列を渡したり、配列を返したりしている。』
といっても良いでしょう。


さて、最後に3次元配列を作って、
配列を渡したり、配列を返したりしてみましょう。
3次元配列は、
  int i,j;
  int ***x=(int ***)malloc(sizeof(int **)*3);
  for(i=0;i<3;i++)x[i]=(int **)malloc(sizeof(int *)*5);
  for(i=0;i<3;i++)for(j=0;j<5;j++)x[i][j]=(int **)malloc(sizeof(int *)*4);
のように宣言します。

では、条件を書きます。
社長mainで3次元配列x[3][5][4]を作り、
それを社員fに送り、
fはx[3][5][4]に1桁のランダムデータを収納させます。
fはさらに、自分が作った3次元配列y[5][5][4]にx[3][5][4]のデータをすべてコピーします。
そして、社長mainに3次元配列y[5][5][4]の先頭アドレスを返します。
社長mainは、その先頭アドレスを
  int ***a; //fが返してくる3次元配列の先頭アドレスの受け皿
で定義されるポインタaに受け取ります。
そして、

3次元配列x[3][5][4]の先頭アドレスと

aのアドレス=3次元配列y[5][5][4]の先頭アドレスを
社員gに送ります。
gは、3次元配列y[5][5][4]のデータをすべて2倍にしてそれを改めて、
3次元配列y[5][5][4]に収納します。
最後に、3次元配列x[5][5][4]と3次元配列y[5][5][4]の全データを
1 7 4 0
9 4 8 8
2 4 5 5
1 7 1 1
5 2 7 6

1 4 2 3
2 2 1 6
8 5 7 6
1 8 9 2
7 9 5 4

3 1 2 3
3 4 1 1
3 8 7 4
2 7 7 9
3 1 9 8


02 14 08 00
18 08 16 16
04 08 10 10
02 14 02 02
10 04 14 12

02 08 04 06
04 04 02 12
16 10 14 12
02 16 18 04
14 18 10 08

06 02 04 06
06 08 02 02
06 16 14 08
04 14 14 18
06 02 18 16

形で出力します。
では、皆さん取り組んで下さい。





第9話へ   第11話へ

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