剥いだ布団とメモランダム.old

情報系のことをかいてゆく

void C++のポインタ備忘録::超基礎編()

暑くなった頃に研究室のB3にはCのプログラミング課題が課せられるよなーってことを思い出して、
その時用に出来るだけポインタの動作がわかりやすいものでも作っておくか、ということで。
今回の記事で扱った内容はCでも一緒のはず。

今回は本当に超基礎的な内容。
配列編、関数編、クラス&インスタンス編、CUDA編あたりはそのうち書こう。

コンパイルgcc version 4.4.7 20120313 (Red Hat 4.4.7-4)でやってます。

/*
	void C++のポインタ備忘録::超基礎編()
	author	しまだ
*/

#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
	int value = 100;
	int* ptr;			// intポインタ型
	// int *ptr;			//こっちの宣言の仕方でも一緒(こっちの方が多いかも)

	/*
		そもそもint型とintポインタ型では「型」が違うので以下のはNG
		(コンパイラに型が違うと言われるかも)

		ptr = value;			
	*/

	cout << "ptr    = " << ptr << endl;	// アドレスが出力される
	cout << "&value = " << &value << endl;	// これもアドレスが表示される
	cout << endl;

	// なのでこういうことはOK
	ptr = &value;

	cout << "ptr    = " << ptr << endl;	// アドレスが出力される
	cout << "&value = " << &value << endl;	// 同じアドレスが表示される
	cout << endl;

	/*	<ポイント.1>
		ポインタ型でない変数に&をつければ変数のあるアドレスが得られる
	*/

	// だからといってこういうのは出来ない(コンパイルエラー)
	// &value = ptr;	(&valueはアドレスを返すが、変数ではない)


	//________________________________________________________________



	// "ポインタ型に入っているアドレス"にある値が欲しい時は、*をつければいい
	cout << "*ptr   = " << *ptr << endl;	// 100が出力

	// だからこういうこともアリ
	int a = *ptr;
	cout << "a      = " << a << endl;	// 100が出力
	cout << endl;


	// ここで、aとvalueのアドレスを確認してみる(一緒ではないことに注意)
	cout << "&a     = " << &a << endl;
	cout << "&value = " << &value << endl;
	cout << endl;
	// *ptrというのは、ptr番地の値を見に行ってるだけ


	// ちなみに、*ptrに値を代入するとptr番地の値が変更される
	*ptr = 1234;
	cout << "*ptr   = " << *ptr << endl;	// 1234が出力
	cout << "value  = " << value << endl;	// 1234が出力
	cout << "a      = " << a << endl;	// 100が出力
	cout << endl;

	/*	<ポイント.2>
		ポインタ型変数に*をつければ、
		「ポインタ型に入っているアドレス」に入っている値をみにいく
		(おそらくここが一般的な混乱の原因か?)
	*/

	//________________________________________________________________


	// ここでptrにaのアドレスを代入してみる
	ptr = &a;

	// だからといってvalueのアドレスまで変更されるわけではない(一応確認)
	cout << "&a     = " << &a << endl;
	cout << "&value = " << &value << endl;
	cout << endl;

	// ptrと&a、*ptrとaが一緒かどうか確認する
	cout << "ptr    = " << ptr << endl;	// アドレスが出力される
	cout << "&a     = " << &a << endl;	// これもアドレスが表示される

	cout << "*ptr   = " << *ptr << endl;	// 100が出力
	cout << "a      = " << a << endl;	// 100が出力


	return 0;
}

実行結果

ptr    = 0x0
&value = 0x7fff55c439fc

ptr    = 0x7fff55c439fc
&value = 0x7fff55c439fc

*ptr   = 100
a      = 100

&a     = 0x7fff55c439ec
&value = 0x7fff55c439fc

*ptr   = 1234
value  = 1234
a      = 100

&a     = 0x7fff55c439ec
&value = 0x7fff55c439fc

ptr    = 0x7fff55c439ec
&a     = 0x7fff55c439ec
*ptr   = 100
a      = 100

このレベルだとあまり需要がない気がする。