* C言語のポインタはどうしたら分かりやすくなるか? -(by [[K]], 2025.08.18) ** (0) 背景情報 -osdev-jp の #雑談なんでも にて、C言語のポインタをどうにかしたい、現状では初心者にとって全然わかりやすくない、こんなのは数十年後にはなくなっていい記法だ、という話がでました(私が言いだしました)。 -それで、じゃあ具体的にどうしたらいいか考えよう、という流れになりました。なんと建設的な! ** (1) 案 -まず、C言語においてポインタは単純な整数ではありません。それは第一に加算や減算時に実際にいくつずつ増減するかというスケールがあからです。これがあるおかげで、sizeofを使わなくても安全に配列アクセスができます。 -まず、C言語においてポインタは単純な整数ではありません。それは第一に加算や減算時に実際にいくつずつ増減するかというスケールがあるからです。 -これがあるおかげで、sizeofを使わなくても安全に配列アクセスができます。 -でもそれが一般整数との差異になってよくないと思うので、 +@ や -@ という演算子を考えたいです。スケールして足す。スケールして引く。引いてからスケールで割る。 //-まずその前に、ポインタに関する加算が勝手にスケールされるという仕様はよい。なぜならそうすることで、sizeofにかかわらずプログラムが同じになるからだ。 // カナやんさん: Cの勉強で体験した地獄って、どんなものがありました? // // ねこがくれさん: ポインタの理解です // // uchanさん: ポインタは難しいと言われますよね。「ゼロからのOS自作入門」でポインタの説明を分かりやすく書いたつもりだったのですが、どうでしたか? // // ねこがくれさん: あれを今から見返してみると、滅茶苦茶わかりやすいのですが、全くと言っていいほど前提知識がなかった当時の私にとっては難しかったですね // 正直、Cを少しでも勉強してからゼロからのOS自作入門を読むべきだったなーと思ってます=_= // 結局、苦しんで覚えるC言語のやつを読んで理解しました // // k-tan: ポインタは必要に迫られるまで勉強しないというのがいいと私は思う。 // 初心者が使うscanfでポインタが必要になるのは非常によろしくない。 // a = my_scanf("%d"); みたいにするべきだー。 // // ねこがくれさん: 複数代入できなくないですか?それだと // // k-tan: そうなんです。できないんです。C言語ではポインタを使わないと複数の値を返せないってことですよね。 // でもそれなら、私は複数の値を返すことをあきらめてもいいと思うのです // (そういう選択肢が欲しいという意味であって、標準関数のscanfみたいな関数が不要だと言いたいわけじゃないです)。 // ポインタを分からないやつはC言語でプログラムするな、みたいな考え方は嫌いです。 // (たまにそういう言い方をする人がいます・・・) // 配列・ポインタ・構造体が分からなくてもある程度のプログラミングはできますよね。 // もっと高度なことがやりたくなった人だけ、配列・ポインタなどに挑戦すればいいじゃないですか。 // 「ポインタが難しいからC言語は嫌い」っていうのは、ポインタの理解を強要するからいけないのです。 // (ポインタが分からない人が悪いわけじゃない!) // ・・・と私は思うのです。 // // ねこがくれさん: それは自分で関数を作れば済む気がします // int scan_int() { // int x; // scanf("%d", &x); // return x; // } // ↑適当に書いたのでミスあります多分 // みたいな関数を作れば済む気がします // // ただ、この関数を作ることにポインタを使うので初心者向きじゃない… // おそらく3年前の私だと理解できないと思います // たしかに、標準のライブラリで実装されていてもよさそうだと思いますね(選択肢として) // // ポインタのせいで私は挫折しかけたので…