// 11_11-12.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include <iostream>
#include <windows.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	/* ポインタ宣言の比較 */
	char *a[2];
	char **p;
	a[0] = "ABC";
	a[1] = "DEF";
	cout << "(1)ポインタの配列aを使って文字列出力\n";
	cout << "a[0]=" << a[0] << '\n';	// ABC
	cout << "a[1]=" << a[1] << "\n\n";	// DEF

	p = a;
	cout << "(2)ポインタのポインタpを使って文字列出力\n";
	cout << "*p=" << *p << '\n';	// ABC
	cout << "*(p+1)=" << *(p+1) << "\n\n";	// DEF

	cout << "(3)ポインタ配列aのアドレス情報を出力\n";
	cout << "a=" << a << '\n';	// 配列aの先頭アドレス
	cout << "&a[0]=" << &a[0] << '\n';	// a[0]のアドレスのアドレス
	cout << "&a[0]=" << &a[0] << '\n';	// a[1]のアドレスのアドレス
	cout << "a[0]=" << (void*)a[0] << '\n';	// a[0]のアドレス
	cout << "a[1]=" << (void*)a[1] << "\n\n";	// a[1]のアドレス

	cout << "(4)ポインタ配列aを使って実データを出力\n";
	cout << "*a[0]=" << *a[0] << " *(a[0]+1)=" << *(a[0]+1) << " *(a[0]+2)=" << *(a[0]+2) << '\n';
	cout << "*a[1]=" << *a[1] << " *(a[1]+1)=" << *(a[1]+1) << " *(a[1]+2)=" << *(a[1]+2) << "\n\n";
 
	cout << "(5)ポインタのポインタpのアドレス情報を出力\n";
	cout << "p=" << p << '\n';
	cout << "(p+1)=" << (p+1) << '\n';
	cout << "*p=" << (void*)*p << '\n';
	cout << "*(p+1)=" << (void*)*(p+1) << "\n\n";

	cout << "(6)ポインタのポインタpを使って実データを出力\n";
	cout << "**p=" << **p << " *(*p+1)=" << *(*p+1) << " *(*p+2)=" << *(*p+2) << '\n';
	cout << "**(p+1)=" << **(p+1) << " *(*(p+1)+1)=" << *(*(p+1)+1) << " *(*(p+1)+2=" << *(*(p+1)+2) << "\n\n";

	/* int型のポインタのポインタを使ったプログラム */
	int d1[3] = {10, 20, 30};
	int d2[3] = {40, 50, 60};
	int *n[2] = {d1, d2};
	int **pp = n;

	cout << *n[0] << '\n';	// 10
	cout << *(n[0]+1) << '\n';	// 20
	cout << *n[1] << '\n';	// 40
	cout << *(n[1]+1) << "\n\n";	// 50

	cout << **pp << '\n';	// 10
	cout << *(*pp+1) << '\n';	// 20
	cout << **(pp+1) << '\n';	// 40
	cout << *(*(pp+1)+1) << "\n\n";	// 50

	MessageBox(NULL, _T("Check Console Window"), L"MessageBox", MB_OK);

	return 0;
}

