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
このレベルだとあまり需要がない気がする。