第7講 箱の住所を代入できる箱(ポインタ)の学習
第6話 2次元配列に対応するポインタ
前話で、ポインタと配列の実体は同じものである・・・
ということが分かりました。
では、2次元配列に対応するポインタはどう宣言するのでしょうか。
例えば、
   int x[5][4];
対応するポインタを宣言するにはどうするればよいでしょうか。
答えは、
   int **x=(int **)malloc(sizeof(int *)*5);
   for(i=0;i<5;i++)*(x+i)=(int *)malloc(sizeof(int)*4);
です。
   int **x=(int **)malloc(sizeof(int *)*5);
で5行分用意して、
   for(i=0;i<5;i++)*(x+i)=(int *)malloc(sizeof(int)*4);
で4列用意しますから、結局5行4列の配列と同じものが出来るのです。


実行画面が
041 067 034
000 069 024
078 058 062
064 005 045

081 027 061
091 095 042
027 036 091
004 002 053

122 094 095
091 164 066
105 094 153
068 007 098
となるアプリ例
#include<stdio.h>
#include<stdlib.h>
void f(); //データを表示する社員
int g(); //データを作成する社員
int main(){
  f();
  return(0);
}
void f(){
  int i,j;
  int x[4][3],y[4][3],z[4][3];
  for(i=0;i<4;i++){
    for(j=0;j<3;j++){
      x[i][j]=g();
    }
  }
  for(i=0;i<4;i++){
    for(j=0;j<3;j++){
      y[i][j]=g();
    }
  }
  for(i=0;i<4;i++){
    for(j=0;j<3;j++){
      z[i][j]=x[i][j]+y[i][j];
    }
  }
  for(i=0;i<4;i++){
    for(j=0;j<3;j++){
      if(x[i][j]<10)printf("00%d ",x[i][j]);
      if(x[i][j]>=10 && x[i][j]<100)printf("0%d ",x[i][j]);
      if(x[i][j]>=100)printf("%d ",x[i][j]);
    }
    printf("\n");
  }
  printf("\n");
  for(i=0;i<4;i++){
    for(j=0;j<3;j++){
      if(y[i][j]<10)printf("00%d ",y[i][j]);
      if(y[i][j]>=10 && y[i][j]<100)printf("0%d ",y[i][j]);
      if(y[i][j]>=100)printf("%d ",y[i][j]);
    }
    printf("\n");
  }
  printf("\n");
  for(i=0;i<4;i++){
    for(j=0;j<3;j++){
      if(z[i][j]<10)printf("00%d ",z[i][j]);
      if(z[i][j]>=10 && z[i][j]<100)printf("0%d ",z[i][j]);
      if(z[i][j]>=100)printf("%d ",z[i][j]);
    }
    printf("\n");
  }
  printf("\n");
}
int g(){
  return(rand()%100);
}
コピペ用添付ファイル
をポインタで実現させるには、
  int x[4][3],y[4][3],z[4][3];

  int **x=(int **)malloc(sizeof(int *)*4);
  for(i=0;i<4;i++)*(x+i)=(int *)malloc(sizeof(int)*3);
  int **y=(int **)malloc(sizeof(int)*4);
  for(i=0;i<4;i++)*(y+i)=(int *)malloc(sizeof(int *)*3);
  int **z=(int **)malloc(sizeof(int)*4);
  for(i=0;i<4;i++)*(z+i)=(int *)malloc(sizeof(int *)*3);
とするだけです。


それでは、皆さん成績一覧表アプリの  

コピペ用添付ファイル
における
  int i,j,b[40],d[40][5],gk[40];
の配列部分をすべて、ポインタにするにはどうしたらよいですか。
答は、30行下。






























答え
  int i,j,b[40],d[40][5],gk[40];
の配列に相当するポインタ
  int *b=(int *)malloc(sizeof(int)*40);
  int **d=(int **)malloc(sizeof(int *)*40);
  for(i=0;i<40;i++)*(d+i)=(int *)malloc(sizeof(int)*5);

  int *gk=(int *)malloc(sizeof(int)*40);

さて、次話では配列を社員(関数)送ることを考えてみます。

第5話へ
 第7話へ

a


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

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座

初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ