参照型と値型とポインタ型は簡単だ

#目次
- [目的](https://qiita.com/kawaguchi5460/items/d18b11fc572e9c93c932#%E4%BB%8A%E5%9B%9E%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%AF%E3%82%88%E3%81%8F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A7%E9%9B%A3%E3%81%97%E3%81%84%E3%81%A8%E8%A8%80%E3%82%8F%E3%82%8C%E3%82%8B%E5%8F%82%E7%85%A7%E3%81%A8%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E4%BC%9D%E3%81%88%E3%81%9F%E3%81%84)
- [値型とは](https://qiita.com/kawaguchi5460/items/d18b11fc572e9c93c932#%E5%80%A4%E5%9E%8B)
- [参照型とは](https://qiita.com/kawaguchi5460/items/d18b11fc572e9c93c932#%E5%8F%82%E7%85%A7%E3%81%A8%E5%80%A4)
- [ポインタ型とは](https://qiita.com/kawaguchi5460/items/d18b11fc572e9c93c932#%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%A8%E5%80%A4)
- [ダブルポインタとは](https://qiita.com/kawaguchi5460/items/d18b11fc572e9c93c932#%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%A8%E3%81%AF)
- [汎用ポインタとは](https://qiita.com/kawaguchi5460/items/d18b11fc572e9c93c932#%E6%B1%8E%E7%94%A8%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%A8%E3%81%AF)

##今回の記事はよくプログラミングで難しいと言われる参照とポインタについて伝えたい
値型、参照型、ポインタ型とは以下の概要である。

##値型
値型は普通の変数(int,float)です。チルノ「値ぃ。」
![チルノの写真](https://cdn.wikiwiki.jp/to/w/boudai/%E6%9D%B1%E6%96%B9%E3%82%AD%E3%83%A3%E3%83%A9%E4%B8%80%E8%A6%A7/%E3%83%81%E3%83%AB%E3%83%8E/::ref/%E3%83%81%E3%83%AB%E3%83%8E%EF%BC%88%E5%BC%B7%E6%B0%97%EF%BC%89.png?rev=252c1cb8fb8d18c2bbe666202d6e5a87&t=20190314223741)

```ex.cs
struct Chiruno{
    public Pos pos;
}
```

##参照と値
![魂魄妖夢の写真](https://i.ytimg.com/vi/qps1tD0zCAQ/maxresdefault.jpg)
<-
![西行寺幽々子の写真](http://livedoor.blogimg.jp/rezanov88/imgs/2/d/2d086139.jpg)
参照と値の関係とは。幽々子は、白玉楼 ref型,妖夢は、白玉楼型となっている。この関係では`幽々子 白玉楼 ref = Ref(妖夢)`となっている。幽々子は妖夢以外の人の居場所を教えることができない(他の人の居場所を教えると怒られる為)。参照の中の大きさはは値のサイズに基本的に等しい(参照の大きさはint程度であることが多い)。例えば霊夢が妖夢がどこいるの?って聞くと今日はここいるよと幽々子が教えるような感じである(必ず、知っている場合はそこにポインティングする)。必ず知っているとは限らないのでその時の場合はもし知らなかったらどうするかを書く必要がある([Null参照問題](https://qiita.com/nakamurau1@github/items/91fa7635674fcb6ff97b))。`幽々子.妖夢`でアクセスできる。

```ex.cs
struct Youmu{
    public Pos{get private set;} = new Pos()
}

class Yuyuko{
    public Youmu youmu{get;private set;};
    public string youmu_name{get;private set;};
    public bool flag{get;private set;};
    public Pos pos{get;private set};
    Yuyuko(string youmu_name){
        this.youmu = new Youmu();
        this.youmu_name = youmu_name;
        this.pos = new Pos();
    }
    Yuyuko(Youmu youmu,youmu_name){
        this.youmu = Youmu()
    }
}
//以下略
var esk = new Youmu();
var vvan = new Yuyuko(esk,"Esk");
```

##ポインタと値
これ以後を読むのはC/C++の人が殆どだと思いますのでC/C++を中心に他の言語を少し含めながら紹介します。
![レミリア・スカーレットの写真](https://i-ogp.pximg.net/c/540x540_70/img-master/img/2016/09/30/18/30/01/59235560_p0_square1200.jpg)
ポインタはどこにでも行くことができる。具体的に言うと紅魔館の主レミリア・スカーレットはZUN氏が作ったキャラクター番号で人の管理をしていたとする。レミリアは紅魔館 ptr型,咲夜は紅魔館型である。`レミリア 紅魔館 ptr = ID(十六夜咲夜)`となる。あくまでレミリアが知っているのはキャラクター番号なのでその番号を加算したり、減算したりして(//`レミリア += 10`等)アリス(部外者)の番号を示した場合もエラーにならないことも多い。これで起こることが([バッファオーバーフロー](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%83%B3))である。勿論Null参照問題(nullptr)も存在する(NullPointerException所謂ヌルポである。)大きさはintと同等の場合が多い。その値自体はそのキャラクターを示せられないので`レミリア->フラン`というアクセスをする。(レミリアが知ってる番号のキャラクターを覗き、そこからいる場所を調べる)

##ポインタのポインタとは
![八雲紫の写真](http://blog-imgs-45.fc2.com/j/i/j/jijojijo/20120605010554419.png)
八雲紫は多くの主(参照、ポインタ)を管理できるとする。紫は 東方 ptr型,レミリアは 紅魔館 ptr型,フランは 紅魔館型`紫 東方 ptr = ID(東方(レミリア))`。`(紅魔館 ptr)(紫->レミリア)->フラン`とアクセスしたり、`(白玉楼 ref)(紫->幽々子).妖夢`とアクセスしたり、できる。また、ポインタのポインタも大きさはintと同等である。このことは以後の汎用ポインタでも重要な概念になる。
@comment ポインタのポインタはよくキャストが起こる。今回はT(object)なので、東方(レミリア)と書く。

##汎用ポインタとは
別に紫,レミリア,さとり,萃香が同じ大きさならそれと同じくらいの大きさのマネージャー(キャラクター番号を読める人)を雇えばよくね？って考えられ作られたのが、汎用マネージャーのこと汎用ポインタである。
![OMMC姉貴の写真](https://pbs.twimg.com/media/EIaJeQLWwAErNeh.jpg)　![YMN姉貴](https://nancreator.com/wp-content/uploads/2017/02/YMNaneki-hatsutoukou-271x300.jpg)
そのマネージャーの対象としては、OOMC姉貴でもYMN姉貴でもいいのである。動的型の様に型さえ違う場合も無問題である。但し、管理は大変である。別に3重ポインタのポインタとしても問題は起こらない。