第12講 ベクタの学習
第2話 配列とポインタの関係(お復習い)

配列とポインタの関係については、
すでに習っています。
その答えは、
『配列とポインタの実体は同じ』
その点を次のコードで確認してみましょう。
#include <stdio.h> //printfを使うためにインクルード
#include <stdlib.h> //mallocを使うためにインクルード
void f(int *x);
void g(int *x);
void main(){
   int x[5];
   int *y=(int *)malloc(sizeof(int)*5);
   int i;
   for(i=0;i<5;i++)x[i]=i+5; //データ作成
   for(i=0;i<5;i++)*(y+i)=i+5; //データ作成
   printf("配列の場合\n");
   f(x); //配列の場合
   printf("\n");
   printf("ポインタの場合\n");
   g(y); //ポインタの場合
}
void f(int *x){
   int i;
   for(i=0;i<5;i++)printf("x[%d]=%d ",i,x[i]); //データを配列要素を使って表示
   printf("\n");
   for(i=0;i<5;i++)printf("*(x+%d)=%d ",i,*(x+i)); //データをアドレスを使って表示
}
void g(int *x){
   int i;
   for(i=0;i<5;i++)printf("x[%d]=%d ",i,x[i]); //データを配列要素を使って表示
   printf("\n");
   for(i=0;i<5;i++)printf("*(x+%d)=%d ",i,*(x+i)); //データをアドレスを使って表示
}
実行結果
o
配列でもポインタでも全く同一であることが分かります。
2次元配列と2次元ポインタ(正確にはポインタへのポインタ)
も同様であることを確認しましょう。
次のように、コードを変更しましょう。
#include <stdio.h> //printfを使うためにインクルード
#include <stdlib.h> //mallocを使うためにインクルード
void f(int *x);
void g(int *x);
void main(){
   int x[5];
   int *y=(int *)malloc(sizeof(int)*5);
   int i;
   for(i=0;i<5;i++)x[i]=i+5; //データ作成
   for(i=0;i<5;i++)*(y+i)=i+5; //データ作成
   printf("配列の場合\n");
   f(x); //配列の場合
   printf("\n");
   printf("ポインタの場合\n");
   g(y); //ポインタの場合
}
void f(int *x){
   int i;
   //データを配列要素を使って表示
   for(i=0;i<5;i++)printf("x[%d]=%d ",i,x[i]);
   printf("\n");
   //データをアドレスを使って表示
   for(i=0;i<5;i++)printf("*(x+%d)=%d ",i,*(x+i));
   int y[5][5];
   int j;
   for(i=0;i<5;i++){
     for(j=0;j<5;j++){
        y[i][j]=5*i+j+1;
     }
   }
   printf("\n");
   //データを配列要素を使って表示
   for(i=0;i<5;i++){
     for(j=0;j<5;j++){
        printf("y[%d][%d]=%d ",i,j,y[i][j]);
     }
     printf("\n");
   }
   //データをアドレスを使って表示
   for(i=0;i<5;i++){
     for(j=0;j<5;j++){
        printf("*(*(y+%d)+%d)=%d ",i,j,*(*(y+i)+j));
     }
     printf("\n");
   }
}
void g(int *x){
   int i;
   //データを配列要素を使って表示
   for(i=0;i<5;i++)printf("x[%d]=%d ",i,x[i]);
   printf("\n");
   //データをアドレスを使って表示
   for(i=0;i<5;i++)printf("*(x+%d)=%d ",i,*(x+i));
   int **y=(int **)malloc(sizeof(int)*5);
   int j;
   for(i=0;i<5;i++)y[i]=(int *)malloc(sizeof(int)*5);
   for(i=0;i<5;i++){
     for(j=0;j<5;j++){
        y[i][j]=5*i+j+1;
     }
   }
   printf("\n");
   //データを配列要素を使って表示
   for(i=0;i<5;i++){
     for(j=0;j<5;j++){
        printf("y[%d][%d]=%d ",i,j,y[i][j]);
     }
     printf("\n");
   }
   //データをアドレスを使って表示
   for(i=0;i<5;i++){
     for(j=0;j<5;j++){
        printf("*(*(y+%d)+%d)=%d ",i,j,*(*(y+i)+j));
     }
     printf("\n");
   }
}
実行結果
配列の場合
x[0]=5 x[1]=6 x[2]=7 x[3]=8 x[4]=9
*(x+0)=5 *(x+1)=6 *(x+2)=7 *(x+3)=8 *(x+4)=9
y[0][0]=1 y[0][1]=2 y[0][2]=3 y[0][3]=4 y[0][4]=5
y[1][0]=6 y[1][1]=7 y[1][2]=8 y[1][3]=9 y[1][4]=10
y[2][0]=11 y[2][1]=12 y[2][2]=13 y[2][3]=14 y[2][4]=15
y[3][0]=16 y[3][1]=17 y[3][2]=18 y[3][3]=19 y[3][4]=20
y[4][0]=21 y[4][1]=22 y[4][2]=23 y[4][3]=24 y[4][4]=25
*(*(y+0)+0)=1 *(*(y+0)+1)=2 *(*(y+0)+2)=3 *(*(y+0)+3)=4 *(*(y+0)+4)=5
*(*(y+1)+0)=6 *(*(y+1)+1)=7 *(*(y+1)+2)=8 *(*(y+1)+3)=9 *(*(y+1)+4)=10
*(*(y+2)+0)=11 *(*(y+2)+1)=12 *(*(y+2)+2)=13 *(*(y+2)+3)=14 *(*(y+2)+4)=15
*(*(y+3)+0)=16 *(*(y+3)+1)=17 *(*(y+3)+2)=18 *(*(y+3)+3)=19 *(*(y+3)+4)=20
*(*(y+4)+0)=21 *(*(y+4)+1)=22 *(*(y+4)+2)=23 *(*(y+4)+3)=24 *(*(y+4)+4)=25

ポインタの場合
x[0]=5 x[1]=6 x[2]=7 x[3]=8 x[4]=9
*(x+0)=5 *(x+1)=6 *(x+2)=7 *(x+3)=8 *(x+4)=9
y[0][0]=1 y[0][1]=2 y[0][2]=3 y[0][3]=4 y[0][4]=5
y[1][0]=6 y[1][1]=7 y[1][2]=8 y[1][3]=9 y[1][4]=10
y[2][0]=11 y[2][1]=12 y[2][2]=13 y[2][3]=14 y[2][4]=15
y[3][0]=16 y[3][1]=17 y[3][2]=18 y[3][3]=19 y[3][4]=20
y[4][0]=21 y[4][1]=22 y[4][2]=23 y[4][3]=24 y[4][4]=25
*(*(y+0)+0)=1 *(*(y+0)+1)=2 *(*(y+0)+2)=3 *(*(y+0)+3)=4 *(*(y+0)+4)=5
*(*(y+1)+0)=6 *(*(y+1)+1)=7 *(*(y+1)+2)=8 *(*(y+1)+3)=9 *(*(y+1)+4)=10
*(*(y+2)+0)=11 *(*(y+2)+1)=12 *(*(y+2)+2)=13 *(*(y+2)+3)=14 *(*(y+2)+4)=15
*(*(y+3)+0)=16 *(*(y+3)+1)=17 *(*(y+3)+2)=18 *(*(y+3)+3)=19 *(*(y+3)+4)=20
*(*(y+4)+0)=21 *(*(y+4)+1)=22 *(*(y+4)+2)=23 *(*(y+4)+3)=24 *(*(y+4)+4)=25


皆さん、課題です。
2次元配列や2次元ポインタを各関数で、
宣言していますが、
mainで定義して引数にして送って下さい。
データの作成もmainで行って下さい。
各関数のプロトタイプ宣言は
void f(*x,y[5][5]
);
void g(*x,**y);

となります。

第1話へ 第3話へ


a

eclipse c++ 入門講義第1部へ

魔方陣 数独で学ぶ V
BA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ