◆ 久々に触ってみます
◆ *や&が意外と分かりやすかった 

何を思ったかポインタってどんなだったっけと思い C言語をちょっと触れてみました

こんな感じで書いてみたら動きました
int main(void) {
int val;
int* ptr;
printf("ptr: %d\n", ptr);

val = 20;
ptr = &val;
printf("val ptr *ptr: %d %d %d\n", val, ptr, *ptr);

val += 10;
printf("val ptr *ptr: %d %d %d\n", val, ptr, *ptr);

*ptr += 10;
printf("val ptr *ptr: %d %d %d\n", val, ptr, *ptr);

return 0;
}
val ptr *ptr: 20 -1080064452 20
val ptr *ptr: 30 -1080064452 30
val ptr *ptr: 40 -1080064452 40

ポインタ変数は 「*」 をつけて宣言します
「&」はその変数メモリ上の場所を表す数値を取得します
ポインタ変数にその値を入れて 「*」つけてアクセスするとポインタ変数が持ってるメモリ上の位置にある変数の値が取得できます

最初にC言語使った時は 「*」のあるなしどっちがどっちなのか覚えにくいし 「&」 とかもうなにそれって感じで困ったものですが 今考えてみるとすごく分かりやすいものだと思えます


まず準備
val = 20;
ptr = &(val);
printf("val ptr *ptr: %d %d %d\n", val, ptr, *(ptr));

val += 10;
printf("val ptr *ptr: %d %d %d\n", val, ptr, *(ptr));

*(ptr) += 10;
printf("val ptr *ptr: %d %d %d\n", val, ptr, *(ptr));
カッコを付けます

記号なのでわかりづらいのでJavaScriptぽく表記してみると
val = 20;
key = getKey(val);
printf("val key getVal(key): %d %d %d\n", val, key, getVal(key));

val += 10;
printf("val key getVal(key): %d %d %d\n", val, key, getVal(key));

getVal(key) += 10;
printf("val key getVal(key): %d %d %d\n", val, key, getVal(key));
こんな感じです
特に 「JavaScript」って感じるところがないですね
C のまま わかりやすくします でもよかったです…

ポインタ変数も普通の変数もただの変数と考えます

「&」があるとメモリ上の場所(key)をもってくるので getKeyという関数に置き換えます
key」 と呼ぶようにした理由はLL言語ユーザからしてイメージつきやすそうだからです

「*」はメモリ上の位置(key)の値を持ってくるので getVal と置き換えます
実際JavaScriptで関数の返り値に += してもエラーですが ここではPHPで参照返しみたいな感じで取得してきた値を書き換えられるんだと想像してください

JavaScriptだと 参照で持っている配列やオブジェクトでも返り値自体は変数に入っていない実体になるので左辺に代入できないんですよね
オブジェクトを返してもらって そのプロパティを更新するくらいしか 返り値を編集する方法がないです


こうしてみるとわかりやすくないですか?


「&」で変数のkeyが取得できます
key自体は「鍵」なわけですからよくわからない数字が入ってます
普通に 変数key を書き換えると key のよくわからない数字が書き換わって val に影響はしません

getVal(key)key に対応する値が取得できます
key を書き換えてなければ val で書き換えていれば別の値になります
JavaScriptほど親切言語じゃないので存在しないところに undefined なんて入ってないのでおかしな値が取り出せたり segmentation fault なんて言われたりします
getVal で取得したものを書き換えると val も編集されます


文法的に似せるために 関数にしましたが getVal(key) += 10; に違和感しか感じないのでこっちのほうがいいかもしれません
val = 20;
key = getKey(val);
printf("val key mem[key]: %d %d %d\n", val, key, mem[key]);

val += 10;
printf("val key mem[key]: %d %d %d\n", val, key, mem[key]);

mem[key] += 10;
printf("val key mem[key]: %d %d %d\n", val, key, mem[key]);

getVal の方を mem というオブジェクトのプロパティアクセスということにしています
mem というのはメモリから来てます

key は数値なのでオブジェクトじゃなくて配列と考えてもいいです
実際にポインタって配列と関わりが深いですし

LL言語からC言語使おうという人の手助けになるのかな これ