// 11_11-5.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include <windows.h>
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	/* 変数のアドレスを&演算子で代入する */
	int d1 = 123;
	int *p1 = &d1;			// 宣言の時はアドレスを入れる
	cout << *p1 << '\n';	// 変数(123)
	cout << &p1 << '\n';	// アドレス
	cout << p1 << "\n\n";	// アドレス

	/* 配列の先頭アドレスを代入する。 */
	/*
	 * 配列名ss2は配列データの先頭アドレスをもっているため&ss2とする必要はない
	 */
	char ss2[5] = "abcd";
	char *p2 = ss2;			// 宣言の時はアドレスを入れる
	cout << *p2 << '\n';	// 先頭の要素(a)
	cout << &p2 << '\n';	// アドレス
	cout << p2 << "\n\n";	// 全要素(abcd)

	/* 配列の1要素のアドレスを&演算子で代入する */
	char ss3[4] = "abc";
	char *p3 = &ss3[2];		// 2番目の要素のアドレスを入れる
	char *p4 = ss3 + 2;		// 2番目の要素のアドレスを入れる
	cout << *p3 << '\n';	// 2番目の要素(b)
	cout << &p3 << '\n';	// アドレス
	cout << p3 << '\n';		// 2番目の要素(b)
	cout << *p4 << '\n';	// 2番目の要素(b)
	cout << &p4 << '\n';	// アドレス
	cout << p4 << "\n\n";	// 2番目の要素(b)

	/* 文字列リテラルの先頭アドレスを設定する */
	/*
	 * ここでは"abcd"という文字列をメモリ上に確保し、
	 * その先頭アドレスがp5に設定される
	 */
	char *p5;
	p5 = "abcd";
	cout << p5 << '\n';			// 全要素
	cout << *p5 << '\n';		// 1番目の要素(a)
	cout << *(p5+1) << "\n\n";	// 2番目の要素(b)

	/* 動的にメモリを確保し、その先頭アドレスを設定する */
	char *p6;
	int d2 = 8;
	p6 = new char[d2];	// 動的にメモリ確保をすると要素数に変数を入れることができる

	MessageBox(NULL, L"Check Console Window", L"MessageBox", MB_OK);
	return 0;
}

