マルチスレッド版数独自動生成ソフト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話へ
本講義トップへ