id:mickey24、id:negaton、id:repose、id:yag_ays、id:totteと。
- autopointerというのがあるらしい
- STLにつっこむとやばいらしい
- shared pointerについて書いてある本があるらしい
- リファレンス
- 変数に別名を付けられる
- ポインタに限らず
- int& n;
- アドレス、かと思ったけど、そうじゃないらしい
- 必ず初期化しないといけないらしい
- newで作ったときはポインタじゃないとだめ
具体例
ポインタを使った例
ポインタが差している先の変数の値を変更すると、ポインタのほうも変わってくれる。
#include <string> #include <iostream> using namespace std; int main(int argc, char *argv[]) { string s1 = "hehehe"; string *s2 = &s1; cout << "Before" << endl; cout << "s1 : " << s1 << endl; cout << "s2 : " << *s2 << endl; cout << "After" << endl; s1 = "fufufu"; cout << "s1 : " << s1 << endl; cout << "s2 : " << *s2 << endl; return 0; }
実行結果。
/tmp% ./a.out Before s1 : hehehe s2 : hehehe After s1 : fufufu s2 : fufufu
同じことを参照で実現
#include <string> #include <iostream> using namespace std; int main(int argc, char *argv[]) { string s1 = "hehehe"; string& s2 = s1; cout << "Before" << endl; cout << "s1 : " << s1 << endl; cout << "s2 : " << s2 << endl; cout << "After" << endl; s1 = "fufufu"; cout << "s1 : " << s1 << endl; cout << "s2 : " << s2 << endl; return 0; }
配列とポインタ、アドレス
- int型なら4バイト、みたいな感じで分かっているからアドレス進めて、という感じでできるのかなと思っていたけど、違うらしい
#include <iostream> using namespace std; int main(int argc, char *argv[]) { int n = 10; int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; for (int *p = a; p < a + n; p++) { cout << p << " : " << *p << endl; } cout << *(a + 1) << endl; return 0; }
実行例。
/tmp% ./a.out 0xbffff850 : 1 0xbffff854 : 2 0xbffff858 : 3 0xbffff85c : 4 0xbffff860 : 5 0xbffff864 : 6 0xbffff868 : 7 0xbffff86c : 8 0xbffff870 : 9 0xbffff874 : 10 2