マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第8章 ポインタの学習

第3話 ポインタは1次元配列として使える

1次元配列によるプログラムコード例
#include<iostream>//インクルードファイルiostreamの読み込み

#include<conio.h>//while(!_kbhit());を使うためのお呪い

#include<string> //文字列変数を使えるようにするために組み込む

#include <iomanip> //setprecisionを使えるように組み込む

#include <cmath>//powなどを使うときに必要

#include <ctime>//time()(←現時刻発生する関数)を使うために必要

using namespace std;//coutを使うときに必要なお呪い

const int n = 10;//具体的な数字を使うのではなく、 n を使うと汎用性のあるプログラムになる!

void 社員1();//ポインタを扱う社員の一人

int main() {//私は社長だ。

  社員1();

  while (!_kbhit());//待機させるための命令

  return 0;//int main() を終わるためのお呪い

}

//1次元配列を扱う社員の一人
void 社員1() {

  int a[n];

  for (int i = 0; i < n; i++) {

    a[i] = i + 1;

  }

  for (int i = 0; i < n; i++) {

    cout << "a[" << i << "] = ";

    if (a[i] < n)cout << " ";

    cout << a[i] << endl;

  }

}
実行結果


a[0] = 1
a[1] = 2
a[2] = 3
a[3] = 4
a[4] = 5
a[5] = 6
a[6] = 7
a[7] = 8
a[8] = 9
a[9] = 10



ポインタによるプログラムコード例
#include<iostream>//インクルードファイルiostreamの読み込み

#include<conio.h>//while(!_kbhit());を使うためのお呪い

#include<string> //文字列変数を使えるようにするために組み込む

#include <iomanip> //setprecisionを使えるように組み込む

#include <cmath>//powなどを使うときに必要

#include <ctime>//time()(←現時刻発生する関数)を使うために必要

using namespace std;//coutを使うときに必要なお呪い

void 社員1();//ポインタを扱う社員の一人

int main() {//私は社長だ。

  社員1();

  while (!_kbhit());//待機させるための命令

  return 0;//int main() を終わるためのお呪い

}

//ポインタを扱う社員の一人
void 社員1() {

  int *a = (int*)calloc(n, sizeof(int));

  for (int i = 0; i < n; i++) {

    a[i] = i + 1;

  }

  for (int i = 0; i < n; i++) {

    cout << "a[" << i << "] = ";

    if (a[i] < n)cout << " ";

    cout << a[i] << endl;

  }

}
実行結果


a[0] = 1
a[1] = 2
a[2] = 3
a[3] = 4
a[4] = 5
a[5] = 6
a[6] = 7
a[7] = 8
a[8] = 9
a[9] = 10


2つの実行結果まったく同じです。

ポインタによるプログラムコード第2例
#include<iostream>//インクルードファイルiostreamの読み込み

#include<conio.h>//while(!_kbhit());を使うためのお呪い

#include<string> //文字列変数を使えるようにするために組み込む

#include <iomanip> //setprecisionを使えるように組み込む

#include <cmath>//powなどを使うときに必要

#include <ctime>//time()(←現時刻発生する関数)を使うために必要

using namespace std;//coutを使うときに必要なお呪い

const int n = 10;//具体的な数字ではなく、 n を使うと汎用性のあるプログラムになる!

void 社員1();//ポインタを扱う社員の一人

int main() {//私は社長だ。

  社員1();

  while (!_kbhit());//待機させるための命令

  return 0;//int main() を終わるためのお呪い

}

//ポインタを扱う社員の一人
void 社員1() {

  int* a = (int*)calloc(n, sizeof(int));//エディタがint *aをint* aと直ししまうので、こちらの書き方を採用します。

  for (int i = 0; i < n; i++) {

    
*(a + i) = i + 1;

  }

  for (int i = 0; i < n; i++) {

    cout << "a[" << i << "] = ";

    if (
*(a + i) < n)cout << " ";

    cout << *(a + i) << endl;

  }

}
実行結果


a[0] = 1
a[1] = 2
a[2] = 3
a[3] = 4
a[4] = 5
a[5] = 6
a[6] = 7
a[7] = 8
a[8] = 9
a[9] = 10


また実行結果は同じです。

つまり、
*(a + i)とa[i]はまったく同じです。

*(a + i)の方はアドレスを操作してから間接参照しています。


1次元配列とポインタは同じです。

そして、アドレスを操作して内容を間接参照することもできます。

a[i]の方も結局アドレスを操作しているのです。

では、2次元配列もポインタによって表現できるのでしょうか。




第8章第2話へ 第8章第4話へ

本講義トップへ