案外簡単:C言語ポインタ解説
<注意>
この記事は友達に見せるように作成した資料なので説明がガバガバです。
・ポインタって何に使うんや
えー皆さん(友達)はこう思ったことは無いですか?
ポインタってあるけどなんでこんなもん使うんや面倒臭いな。と・・・。
・例えばプログラムのログに「10」と表示してみるとする。
ポインタを使わなければこんな感じで書けるはずだ。
//変数宣言
int Num = 10;
//ログに描画(出力)
cout << Num << endl;
うん。超簡単。
「これでええやんけ」と言いたくなる。
何なら私もそうである。
ではポインタを使用した例はどうなるのかを見てみよう。
//変数宣言
int Num = 10;
//ポインタ作成
int *ptr;
//ポインタに変数を読み込み
ptr = &Num;
//ログには10と表示される
cout << *ptr = endl;
こんな感じ。
・唐突に出てくる「*」と「&」
・ptrをCout(表示)しているのになぜか10と表示される。
初心者からすればマジで発狂もんである。
ではなぜこんなファッキンなものが必要とされるのか。
それは
「幅広い場所からデータにアクセスできるようになる」
からだ。
例えば「GOKU」と「BEJITA」という関数があるとしよう。
通常であれば「GOKU」は「BEJITA」の中にある変数の数値を変更することは出来ない。
だが、ポインタを使用すればそれを変更できる様になる。
そんな感じで
関数を経由してローカル関数にアクセスできる
から使用されるのである。
コレを確か「間接参照」とかって言った気がするがまぁそれは今はどうでもいいので放置する。
あと、この「*」を使用するポインタを生ポインタと呼ぶ
実際、生ポインタ(ナマポ)は使いづらいので
「SharedPointer」とか「WeakPointer」を使うのだが今回はパスする。
(いちいち開放処理書くの面倒くせぇんだよ!w (#^ω^)つパァン!)
*コイツらは相互参照防いだりコピーによるメモリの使用量を抑えたりしてくれる。(確かそうだったはず)
んー実際どうやって使うん?
いや、そうよな。それよな。
というわけでちょっと実例を乗せてみた。
といっても使い方には色々あるので今回は
「値渡し」と「参照渡し」を用いて書いてみる。
コイツらにはちょっと違いがあるので考えてみてほしい。
参照渡し
//現在のHP
int nowHP = 10;
int damage = 1;
void Main()
{
//関数呼び出し
void HitUpdate(nowHp);
}
//関数の内部処理
void HitUpdate(int &s_nowHp)
{
//HPが減少処理
s_nowHp -= damage;
}
ポインタ渡し
//現在のHP
int nowHP = 10;
int damage = 1;
void Main()
{
//関数呼び出し
void HitUpdate(&nowHp);
}
//関数の内部処理
void HitUpdate(int *s_nowHp)
{
//HPが減少処理
s_nowHp -= damage;
}
はい、というわけで書いてみたのだが、おわかりいただけただろうか?
正解は「nowHpの数値に違いがでる」である。
最初は「は?」となるがもう一度見てみよう
違いの原因は下記の場所である。
//参照渡し
void HitUpdate(int &s_nowHp)
{
}
//ポインタ渡し
void HitUpdate(int *s_nowHp)
{
}
参照渡しには「&」がポインタ渡しでは「*」がついているのがわかるだろうか。
決定的な違いはそこである。
簡単に言うと
「&」は内部の数値をコピーして渡すのに対して
「*」は内部の数値本体を渡してくるのだ。
その結果、1度処理を実行した際にmainでnowHpを表示すると
・参照渡しは10
・ポインタ渡しは9
と表示されるのである。
このようにポインタは渡す形式によって結果が変化するので、
使用時には気をつけよう。
覚えれねぇよ!どうすんねん!
うんうん・・・。俺もそうだったわ。
ので、コレだけ覚えとけってのをここからは書きます
・ポインタはアクセス範囲を広げられる。
・ナマポは使いづらいからスマートポインタを早く覚える。
・「*」は本体を呼び出す
・「&」は本体のコピー品を呼び出す
・ポインタにはデータ本体の住所が入ってる
以上!
正確には正確にはポインタにメモリの番地記録してその番地の中にある本体を出すんだがややこしいからとりあえずコレで最初は覚えとけ!w
内部の詳細なんてもんは自分の中でパターン化してからでも遅くは無いのだ!(てか俺がそうだった。)
てなわけで今回は終わり!
じゃあの!