C++ なら、ポインタを使わないですますーポインタから脱却するべきではないですか? ポインタでなければならない場合ってありますか? ポインタを使いがちな局面

補足

実の所、ポインタを完全追放できる/したいなんて思ってません 実務では、ポインタ使いまくりだし K&R でポインタの章を呼んだ時、「ポインタ変数とはアドレスレジスタの事」と悟ってから ポインタって何?では悩んだ事が無いので(ポインタがらみのチョンボから解放されていたわけではないけど) ・ポインタが判りません ・ポインタは C言語の鬼門 ・ポインタで挫折する というセンスが実感できなかった 時を経て、C++ を学び JAVA の噂を聞いてきて 知○袋で「C++ です、ポインタが判りません」な質問を見た時、 ポインタは「参照に置き換えて、ポインタは忘れましょう」てな回答をしてしまった 一旦言挙げしてしまうと、言霊に取り付かれ、 ポインタ廃絶原理主義過激派思想が湧いてきて この質問の投稿に至ってしまった 回答に対する res が過激すぎになったのは予想外だ!

C言語関連 | プログラミング982閲覧xmlns="http://www.w3.org/2000/svg">500

ベストアンサー

NEW! この回答はいかがでしたか? リアクションしてみよう

・文字列の処理 ポインタで突き廻す習慣が確立しているので、アップデートしなきゃならんらしい ・関数ポインタ → 関数オブジェクト 「関数オブジェクト」って、理解できていないですねぇ、何だこりゃ状態 関数オブジェクトは要再学習 typedef stateAct‗t * (*stateAct‗t)(void); //エラーです stateAct‗t * curState = init_state; while(curState){ curState = curState() } みたいに関数ポインタで作っていた状態遷移マシンを 作り直す必要が出てきた \(^o^)/ ・アドレスレジスタにアドレスを置いての間接参照 → Cではポインタアくセスと言う がポインタの理解なので、いまさらポインタが理解できないと言われても、、左辺値の word は K&R にも出てるし・・定義が変わったのか?

ThanksImg質問者からのお礼コメント

ポインタが C++ の鬼門なんて聞いて、なくせるじゃんと思ったのを皆さんに聞いてみたけど よく知らなかった点をいろいろ指摘いただいて有難かった ポインタが残る局面はいろいろありそう ※ 実際、ポインタまるけのコード書いてるし、 勉強すべき課題を最初に教えて頂いたので BA を

お礼日時:2023/12/2 10:45

その他の回答(9件)

ポインタを使わないで済ませられるのなら、そもそもCやC++以外の言語を使えばいいだけでは? CやC++はポインタを使ってモノゴトを解決するためにある、といっても過言ではないと私は思っています。

ポインタを使わないで済ませられるのなら、そもそもC以外の言語を使えばいい だから C++ を使う C++ のポインタは、当初 C の上位互換にこだわったために、必要悪として残って入るだけなので、(マイルールで)廃止できない? ※ 実際は、ポインタで書けば短時間で書けてしまうので、マイプログラムはポインタの嵐、置き換えたい

「参照は使うがポインタはNG。すべての型は既定で値型的に扱う。」 コードはある種美しくなるのかもしれませんが 実際問題ではやはりスケールの問題で行き詰まるのではないかと。 ポインタを使いたくないというのであれば参照を駆使することにな りますが、古い話ですがPASCALの関数引数のvarが使用箇所で参照か 値かが区別できないことが結構混乱を招いた頃に振り戻すことにな りそうです。 C++では参照はやはりごく一部の例外として使うものではないかと。 (演算子のオーバーロード等のような特殊な箇所以外では使用しな いほうが良いということです)

繰り返しますが参照は演算子のオーバーロードを記述できるようにする ために必要悪的に導入されたようなものという気がします(個人的見解です) それが関係してか、 void f(int &x,int y,char *s); の呼び出しでC#のように(C++20とかもそうかもしれませんが) f(ref x,y,s); と書けなないのならあまり使いたくありません。 書けたとしてポインタよりも多少安全になる?のでしょうが、 このことが大きなメリットであるとまでは感じません(個人的意見です) それに比べて**例えば** f(x,=y,=s); といった書き方(呼び出し側では値渡引数の前に記号をつける) とかの解禁のほうがまだマシではないかと感じます。 しかしもちろんこれはとうてい受け入れられるとは思えませんが。

test(int& x) とすべきところを test(int x) と致命的なミスをしても、コンパイルが通ってしまうところがネック。 あとは動的なインスタンス Test* p = new Test(); delete p; p = 0 無理やり Test& o = *(new Test()); delete &o で使えたけど、かえって見づらい。* や & でポインタの片鱗が見えちゃってるし。 ポインタなら使い終わったら0を入れておけばよいが、参照先を変えることはできない(よね?)ので、判定が必要な場合は確保中かのフラグが別途必要となる。 参照じゃないと困るのは、演算子の定義ぐらいであとはポインタの方が素直に感じます。

ポインタでなければならない場合の例を挙げます。 1. メモリマップドI/O 2. asyncの関数仮引数 3. インターフェイス 各箇条について反論があればどうぞ。

1. メモリマップドI/O 1152458994さん への 2023/11/24 9:05 の返答で書いたけど、 これはポインタで無いと無理そう でも、高級言語がサポートする機能の範疇を超えてない? 2. asyncの関数仮引数 async() 代替え関数の仮引数を、関数オブジェクトへの参照に置き換えればポインタ排除できるのでは? 関数ポインタについては、代替え手段の提案が出てる >1152458994さん 2023/11/24 4:06 関数ポインター経由で実行する関数を切り替えるのも、関数オブジェクトでラッピングして隠蔽すれば内部と初期化でのみ使う(←言語仕様上の不備をカバーする)ように代替方法を提案可能です >かつさん 2023/11/24 8:58 >関数ポインタもfunctionalヘッダにfunctionクラスがあるのでオブジェクト化できる

> ポインタから脱却するべきではないですか? ポインタは別に忌避すべきものではないのでどちらでも。 (ある程度の規模のものを作る時に全て避けるのは不可能だと思いますが) 適当なクラスでラップすれば表に出さないことはできるので、そういったライブラリを使う側なのか作る側なのかの問題だと思います。 > ポインタでなければならない場合ってありますか? 結構ありますよ。 ・チェーンリストなどのデータ構造。 https://captain-cocco.com/c-list-struct/ ・アドレスでしか提供されていないデータにアクセスする場合。 (組み込み系やデバイスドライバの開発では普通) ・一次元配列の特定の位置に入ったデータを(高速に)抜き出す時。 (1次元配列を多次元配列として扱うときも同様) 例:通信で受信した11~14番目にint型が入っている場合 int intDat = *((int *)(data+11)); // dataはchar型の配列 // エンディアンが違う機器間での通信だと使えない

・チェーンリストなどのデータ構造。 list<> を使う側なら不要ですね list<> の代替えを作る事になったら、、、ポインタ使いそう、代替えは有るか? ・アドレスでしか提供されていないデータにアクセスする場合。 これの事? >gam********さん 2023/11/24 11:03 1. メモリマップドI/O 1152458994さん への 2023/11/24 9:05 の返答で書いたけど、 これはポインタで無いと無理そう でも、高級言語がサポートする機能の範疇を超えてない?