第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<iostream> //入出力のために組み込む
using namespace std; //coutを使えるようにするために必要
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)cout<<" "<< a[i][j]; //10未満のデータ表示
if (a[i][j]>=10 && a[i][j]<100)cout<<" "<<
a[i][j]; //10以上100未満のデータ表示
if (a[i][j] >= 100)cout << " "<< a[i][j];
//100以上のデータ表示
}
cout << endl; //改行
}
cout << endl; //改行
}
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)cout<<" "<< a[i][j]; //10未満のデータ表示
if (a[i][j]>=10 && a[i][j]<100)cout<<" "<<
a[i][j]; //10以上100未満のデータ表示
if (a[i][j] >= 100)cout << " "<< a[i][j];
//100以上のデータ表示
}
cout << endl; //改行
}
cout << endl; //改行
}
実行結果は
となります。
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話で作った成績一覧表プログラムをポインタによって書き換えてください。