Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。288件6C言語はポインタの理解が難しいと、方々で言われています。その原因の一つにポインタの表記方法があると考えています。ポインタ宣言時と、アドレス代入時で同じ*の意味が異なります。*pointer;の*は、pointerアドレスに格納された値を取り出すこと示すものです。*pointerの表現方法として、*を使わない方法をなぜ取らなかったか、できない理由があったのかということです。constやstaticのように、intの前にpointとか書く方法もあったのではないでしょうか。ポインタpointerは、*pointerで中身を指し示し、pointerでアドレスを表現しますが、これ、どう考えても逆の方が良かったんじゃないの?って思います。逆にすると、何かしら弊害があるのでしょうか。C言語について知識が足りないため、至らない点あるかと思いますが、お付き合い頂ければ幸いです。票6歴史的なことは初期のCコンパイラーがヒントになるかもしれません。下記はその紹介記事です。デニス・リッチーによって書かれた最初のCコンパイラーがGitHubで公開この頃には既にポインターが存在していました。*ip;という表現も受け付けたようですが)。Cの変数は必ず何らかの記憶域(storage)を持つ実体(object)です(記憶域はメモリ上とは限りませんし、しばしば最適化によって変数自体がなかったことにされることもありますが)。変数を束縛している実体は変数の記憶域に収まっているということです。JavaやC#の参照型のようなオブジェクト自身であるところの実体と変数の記憶域が異なるような変数はありません。変数と実体が同じであるという構造は、変数への操作が単純なメモリ上のデータ操作に変換できるため、コンパイラも非常に単純な作りにすることができます。文字列などのシーケンシャルなデータを扱うには配列のような仕組みが必要になります。配列全体を実体とすることは可能ですが、別の変数に同じ配列を見せようとしても、そもそも複数の変数が同一の実体を共有することは出来ませんし、配列全体をコピーすることも非効率です。変数とオブジェクトの寿命が必ず一致してしまうということは、コンパイル時に静的に決まる変数では、データを動的に生成・消滅させることが難しくなってしまいます。そこで、ポインターという実体です。配列へのアクセスをポインターのアクセスと同様に扱える(配列とポインターが全く同じと言うことではありません、この二つは厳密に区別されます)ようにすることで、ポインターを介した配列操作を可能にしました。malloc等で動的に確保した記憶域については、ポインターを介してアクセスすることで、変数の寿命と動的に確保された記憶域にあるオブジェクトの寿命を切り離すことが出来ました。重要なのはポインターも一つの実体に過ぎないと言うことです。して、Cはその言語構造を複雑化することなく、ポインターを用いて強力な表現を可能にしました。当時の技術は今ほどコンパイラや構文解析の研究が進んでいないため、単純であると言うことは極めて重要でした。JavaやC#の参照型ような型を別途用意するような複雑さは取り入れることはしなかったのです(当時、そのような言語が全くなかったのかまではわかりません)。ポインターをどのように表現するのかです。ip[];という形でした。ポインターと配列は同様に扱えると言うことから、配列の宣言のように書けることはそれはそれで意味があったと思います。(ip[]);ともいえます。ipを配列とみなしてその要素にアクセスしたときの型はintであるということです。*ip;もまた同様に考えられます。ipをポインターとみなしてその指し示す先の実体の型がintであるということです。これは、宣言ではないところでの*と同じような解釈(ポインターの指し示す先の実体という解釈)をしているということです。このようにすることで、構文解析を単純化しようとしたのではないかと推測されます。それが当時うまくいったのかまではわかりませんが。その後の言語を見るとこの方法は失敗だったと考えられます。*でひとまとまりの型だと見られてしまうという誤解も生みました。配列は後置になるため、更に混乱の元でしょう。Java等ではint[]のような型表現を前置におくようにしたのもそれらが理由と思われます(C/C++ユーザーのため、Javaでは後置の書き方もサポートはしていますが)。最近は型を前置すること自体がよろしくないと考えられており、後置の言語(Go、Rust等)が増えているようにも思います。個の銅バッジありがとございます。ip[]と書いていた"というのが驚きですが、経緯がわかったような気がします。|-2まず、以下は私の私見で、間違いがあればごめんなさい。この理解、あっていますか?ポインタはあくまでもどこまでも、アドレスを「ポイント」するだけで、知りえたアドレス情報をどう取り扱うかはプログラマ側にゆだねられている理解です。「メモリ上のこの場所から情報が格納されているよ」という情報だけを渡してこられるので、そこから先のメモリに入っている値を何バイト読みこんでデータとするかはプログラム側にゆだねられる。pointerも結局アドレスを渡しているだけ。値では渡されていない。*pointer;の*は、pointerがポインタであることを示す。*pointer;の*は、pointerがポインタaに渡すべき「アドレス」を示すポインタであることを示す。一貫性が取れているのではないかと考えています。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。1なぜFILEポインターはコピーできないのですか?9構造体のアドレスと構造体の最初のメンバーのアドレスは同一であるとして良いか?0ポインタと配列に関して2標準ライブラリの関数の引数の定義の読み解き方がわからない。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。