【C++】参照とポインター完全に理解した
色々試したのでメモ。
用意したもの
以下の 4 種類の関数を用意した。
値渡し(何もつけずに書いたやつ)
#include <iostream> int sum(int in1, int in2) { return in1 + in2; } int main() { int input1, input2; std::cin >> input1 >> input2; int result = sum(input1, input2); std::cout << result << std::endl; return 0; }
参照渡し
#include <iostream> int sum(int& in1, int& in2) { return in1 + in2; } int main() { int input1, input2; std::cin >> input1 >> input2; int result = sum(input1, input2); std::cout << result << std::endl; return 0; }
ポインタ渡し(move)
#include <iostream> #include <memory> int sum(std::unique_ptr<int> in1, std::unique_ptr<int> in2) { return *in1 + *in2; } int main() { std::unique_ptr<int> input1(new int (0)), input2(new int (0)); std::cin >> *input1 >> *input2; int result = sum(std::move(input1), std::move(input2)); std::cout << result << std::endl; return 0; }
ポインタ参照渡し
#include <iostream> #include <memory> int sum(std::unique_ptr<int>& in1, std::unique_ptr<int>& in2) { return *in1 + *in2; } int main() { std::unique_ptr<int> input1(new int (0)), input2(new int (0)); std::cin >> *input1 >> *input2; int result = sum(input1, input2); std::cout << result << std::endl; return 0; }
それぞれの挙動
- 値渡し
- 参照渡し
- 参照が渡る
- 参照先で読み書きができる。
- 参照先で変更すると、参照元が変更される。
- 参照が渡る
- ポインタ渡し(move)
- ポインタが渡る
- 参照先で読み書きができる。
- 参照元の変数は、利用できなくなる。 (
unspecified state
になる。参考:std::move - cppreference.com)
- ポインタが渡る
- ポインタ参照渡し
- ポインタの参照が渡る
- 参照先で読み書きができる。
- 参照先で変更すると、参照元が変更される。
- ポインタの参照が渡る
所感
C++なんもわからんので、ぼちぼち学んでいきたいところです。 Rustの方が怪しい書き方した時に警告出してくれがちなので現状すき。
おまけ
アセンブリで挙動追いかけてみた。 ほんとに上記の通りになってて面白い(当たり前)