mimithon#4会場なう

id:mickey24id:negatonid:reposeid:yag_aysid: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