第11講 ポインタの学習
第7話 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);
さて、次話では配列を社員(関数)送ることを考えてみます。
これで箱そのものを直接渡すことができないのに、
箱の中身を変えるように依頼するという謎が解けます。
第6話へ 第8話へ
第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 入門 サイト 基礎から応用まで
本サイトトップへ