第7講 ポインタ
第5話 2次元配列に対応するポインタの宣言
配列とポインタが同じであるとしたら、
int a[10][10];
はポインタではどのように宣言するのでしょうか。
int i;
int **a = (int **)malloc(sizeof(int *)*10);
for(i = 0; i < 10; i++)*(a+i)=(int *)malloc(sizeof(int)*10);
がその答えです。
コードを次のように変更して下さい。
#include<stdio.h>
#include<stdlib.h> //malloc()が使えるようにインクルード
void f(); //関数f()のプロトタイプ宣言
void g(); //関数g()のプロトタイプ宣言
int main() {
f(); //関数f()に仕事を命じている
g(); //関数g()に仕事を命じている
return(0);
}
void f() {
int a[10][10], i,j; //配列と制御変数の定義
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++)a[i][j] = 10 * i + j + 1; //データ作成
}
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
if(a[i][j]<10)printf(" %d ",a[i][j]); //データ表示
if (a[i][j]>=10 && a[i][j]<100)printf(" %d ", a[i][j]); //データ表示
if (a[i][j] >= 100)printf("%d ", a[i][j]); //データ表示
}
printf("\n"); //改行
}
printf("\n"); //改行
}
void g() {
int **a = (int **)malloc(sizeof(int *) * 10), i,j; //配列と制御変数の定義
for (i = 0; i < 10; i++)*(a+i) =(int *)malloc(sizeof(int)*10); //データ作成
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++)a[i][j] = 10 * i + j + 1; //データ作成
}
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
if (a[i][j]<10)printf(" %d ", a[i][j]); //データ表示
if (a[i][j] >= 10 && a[i][j]<100)printf(" %d ", a[i][j]); //データ表示
if (a[i][j] >= 100)printf("%d ", a[i][j]); //データ表示
}
printf("\n"); //改行
}
printf("\n"); //改行
}
実行結果は
となります。
int **a = (int **)malloc(sizeof(int *)*10);
for(i = 0; i < 10; i++)*(a+i)=(int *)malloc(sizeof(int)*10);
は
int **a = (int **)malloc(sizeof(int *) * 10), i,j; //配列と制御変数の定義
for (i = 0; i < 10; i++)a[i] =(int *)malloc(sizeof(int)*10); //データ作成
とも記述できます。
これを参考にして3次元配列
int a[3][10][6];
に対応するポインタを考えてみて下さい。
答えは30行下。
答え
int i,j,k;
int ***a = (int ***)malloc(sizeof(int **) * 3);
for (i = 0; i < 3; i++)a[i] = (int **)malloc(sizeof(int *) * 10);
for (i = 0; i < 3; i++) {
for (j = 0; j < 10; j++)a[i][j] = (int *)malloc(sizeof(int *) *
6);
}
第6講第8話で作った成績一覧表プログラムをポインタによって書き換えてください。