第7講 ポインタの学習
第7話 2次元配列に対応するポインタは?
前話で、ポインタと配列の実体は同じものである・・・
ということが分かりました。
では、2次元配列に対応するポインタはどう宣言するのでしょうか。
例えば、
int x[5][4];
対応するポインタを宣言するにはどうする?
答えは、
int **x=(int **)malloc(sizeof(int *)*5); //2016/12/27に間違いを訂正
for(int i=0;i<5;i++)*(x+i)=(int *)malloc(sizeof(int)*4);
です。
実際次のコードを組んで試しましょう。
#include<iostream>
#include <stdlib.h>
using namespace std;
void f();
void g();
void main(){
f();
cout<<endl;
g();
}
void f(){
int x[5][4];
int i,j;
for(i=0;i<5;i++){
for(j=0;j<4;j++){
x[i][j]=4*i+j+1;
}
}
for(i=0;i<5;i++){
for(j=0;j<4;j++){
if(x[i][j]<10)cout<<"0"<
<x[i][j]<< " "; else cout<<x[i][j]<<"
";
}
cout<<endl;
}
}
void g(){
int **x=(int **)malloc(sizeof(int *)*5); //2016/12/27に間違いを訂正
int i;
for(i=0;i<5;i++)*(x+i)=(int *)malloc(sizeof(int)*4);
int j;
for(i=0;i<5;i++){
for(j=0;j<4;j++){
x[i][j]=4*i+j+1;
}
}
for(i=0;i<5;i++){
for(j=0;j<4;j++){
if(x[i][j]<10)cout<<"0"<<x[i][j]<<
" "; else cout<<x[i][j]<<" ";
}
cout<<endl;
}
}
同じ変数名xを使って問題ないことはお分かりですね。
関数は独立しているので、
問題ないのです。
変数にしても配列にしてもポインタにしても、
関数の中でしか通用しないローカル変数です。
実行結果
int **x=(int **)malloc(sizeof(int *)*5); //2016/12/27に間違いを訂正
for(int i=0;i<5;i++)*(x+i)=(int *)malloc(sizeof(int)*4);
で2次元配列ができていることが分かります。
1行目
int **x=(int **)malloc(sizeof(int *)*5);
で行数5が指定され、2行目
for(int i=0;i<5;i++)*(x+i)=(int *)malloc(sizeof(int)*4);
で列数4が指定されるのです。
ポインタを学んだ現在、
配列を関数に渡す事が可能になりました。
1次元配列
int x[10];
をmain()で定義して、それを関数f(int *x){またはf(int x[10])}とg(int *x){またはg(int x[10])}に渡し、
関数f(int *x){またはf(int x[10])}ではデータ(ランダムな1桁の整数)を生成させ、
関数g(int *x){またはg(int x[10])}ではそれをコンソールに表示するプログラムを考えましょう。
配列を引数にする場合
void f(int *x); //関数側がポインタで受け取るとき
void f(int x[10]); //関数側が配列で受け取るとき
のようにプロトタイプ宣言をして、
main()からは、
f(x);
のようにして関数fを呼び出します。
配列を送ると行っても正確には、
配列の先頭アドレスを送るということなのです。
では皆さんプログラムコードを考えてください。
第6話へ 第8話へ
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ