第7講 ポインタ
第4話 ポインタと配列の関係

#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], i; //配列と制御変数の定義
  for (i = 0; i < 10; i++)a[i] = i + 1; //データ作成
  for (i = 0; i < 10; i++)cout << a[i] << " "; //データ表示
  cout << endl; //改行
}
void g() {
  int *a = (int *)malloc(sizeof(int) * 10), i; //配列と制御変数の定義
  for (i = 0; i < 10; i++)a[i] = i + 1; //データ作成
  for (i = 0; i < 10; i++)cout << a[i] << " "; //データ表示
  cout << endl; //改行
}
の実行結果
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10

なんと同じです。
第4話のテーマ名がポインタと配列の関係となっていますが、
この問いに対する答えは、
両者は同じものである・・・です。
どうして同じになるのか。
  int *a=(int *)malloc(sizeof(int)*10);
によって、4×10=40バイト分のデータ領域が確保できるからです。
int型10個分です。
だから、配列と同じになります。

説明を補うために小学生からエンジニアまでのC言語入門から引用しておきます。
変数名はxとなっており確保するデータ個数は5個となっていますが、本質は同じです。
ただし、番地の表示は10進数で説明してあります。
  int *x=(int *)malloc(sizeof(int)*5);

  int x[5];
と宣言するのと同じなのです。
(int *)malloc(sizeof(int)*5);
のmallocはメモリを確保させる命令です。
sizeof(int)*5のメモリ容量がint型の5つ分を示しています。
sizeof(int)でint型のサイズすなわち4バイト分です。
sizeof(int)*5で結局は4×5=20バイト分になります。
(int *)はint型のポインタであることを示しています。
  int *x=(int *)malloc(sizeof(int)*5);
によって、例えば
ouu
(もちろん、1000〜1004は1001以上1004以下です。他も同様です。)
のように20バイト分メモリ容量が確保されるわけです。
そして、それぞれの箱が順にx[0]からx[4]に対応して、
w
となるわけです。

くどいようですが、変数のために確保されたメモリが1001〜1004のとき、
その変数のアドレスを1つ手前の1000で定義するのでしたね。
(もちろん、1000〜1004は1001以上1004以下です。)
012であることを説明しています。

配列とポインタは同じである!
ですから、
void f() {
  int a[10], i; //配列と制御変数の定義
  for (i = 0; i < 10; i++)
a[i] = i + 1; //データ作成
  for (i = 0; i < 10; i++)cout <<
a[i] << " "; //データ表示
  cout << endl; //改行
}
void g() {
  int *a = (int *)malloc(sizeof(int) * 10), i; //配列と制御変数の定義
  for (i = 0; i < 10; i++)
a[i] = i + 1; //データ作成
  for (i = 0; i < 10; i++)cout <<
a[i] << " "; //データ表示
  cout << endl; //改行
}

#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], i; //配列と制御変数の定義
  for (i = 0; i < 10; i++)
*(a + i) = i + 1; //データ作成
  for (i = 0; i < 10; i++)cout <<
*(a + i) << " "; //データ表示
  cout << endl; //改行
}
void g() {
  int *a = (int *)malloc(sizeof(int) * 10), i; //配列と制御変数の定義
  for (i = 0; i < 10; i++)
a[i] = i + 1; //データ作成
  for (i = 0; i < 10; i++)cout << *(a + i) << " "; //データ表示
  cout << endl; //改行
}
と書き換えても同じ結果です。
つまり、
a[i]と*(a + 1)はまったく同じなのです!




第3話へ   第5話へ

002

初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門

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