*」という型の「p」という変数を作っているのです。*」は、「int型変数のアドレスを入れる型」ということです。*の「*」では意味が違うのです。*」がひと塊で、型の名前です。*pの「*」は演算子で、「そのアドレスの中身を指す」という演算子です。*の次に来る変数の中身はアドレスでないといけません。*pは、pに入っているアドレスが指す先ということになるのです。さんC言語のその部分の文法は、分かりにくいことで悪名高く、昔から批判されています。*」は(どちらもポインタに関係する、という以外は)全く別の意味を表しており、たまたま同じ記号を使っているに過ぎない、と覚えるのがなんとか一貫した説明になります。「違う意味なのに同じ記号を使うなんて一貫性がないではないか」と言われれば、まさしく仰る通りですとしか言いようがありません。なんとも覚えにくい規則で、初心者はほぼ確実に引っかかる必殺の初心者殺しですが、何十年も前から決まっていることなので今更変えることができないのです。勉強頑張ってください。1年前ポインター変数の書き方がp*というのは誤解があります。いう書き方はありません。*」型、つまりint型を指すポインター変数(中身はint型の何かの変数のアドレス)がpです。&p;という書き方は真っ当です。「int」型が*pだという風に理解したらどうでしょう。バグのないプログラムはない。プログラムは思ったとおりには動かない。*」という型の「p」という変数を作っているのです。*」は、「int型変数のアドレスを入れる型」ということです。------非常に丁寧に書かれているテキストではありますが、このような誤解をさける説明がないので驚いています。ここで質問しておいて良かったです。テキストではintと*の間を入れてますので、余計に*pでひと固まりだと誤解してしまいます。pでも正常に作動しましたが、これはコンピュータが補正して読み込んでるのか、どちらでも正しいのかどっちなんでしょうかねよそさまのページによりますた変数が2つ以上だと、2つ目以降は普通のint型変数になってしまうらしいですね。&a;になるのです-----なるほど、一瞬なんでa=アドレスにすれば、&なんていらんじゃないかと思いましたが、そのアドレスが分からないんですものね>*pの「*」は演算子で、「そのアドレスの中身を指す」という演算子です。*の次に来る変数の中身はアドレスでないといけません。---なるほど、よく分かりました。もやもやが解けて本当に助かりました。ありがとうございました。時点ではねられている、エラーになっているとみるべきですね。pをint型変数を入れる変数型としないと、アドレスを読み込めない仕様となっているようです。↑1年前ただちょっと疑問がありまして、int型変数のアドレスもintに内包されるので64ビット実行環境だとintが32ビットでアドレスが64ビットだったりすることがあります。C/C++言語において、アドレスの表現は、コンパイラ側で勝手に決めていいということ以外は規定がありません。あと、アドレスをprintfの%dで表示するということにおいては、PCがぶっ飛んでも不思議ではないことだというふうに定義されています。コンパイラなりOSなりが、PCがぶっ飛んだりするような大事には至らないように対処してくれます。OSが起動しなくなるくらいはたまにあることですが。%pで表示するにしてもその形式はコンパイラ依存なので、まじめに中身のビット列を見たいならchar配列に格納して1バイトずつ表示しましょう。charは内部表現を保持できる型として保証があります。1年前オフトピック前言時の*はポインタ宣言子。変数名(直接宣言子)には含まれない。**pp;iは、『int』という型の値を保持できる変数。pは、『int』+『へのポインタ』という型の値を保持できる変数。ppは、『int』+『へのポインタへのポインタ』という型の値を保持できる変数。iを使って、intという型の値を『直接』やりとりできる。pを使って、intへのポインタという型の値を『直接』やりとりできる。ppを使って、intへのポインタへのポインタという型の値を『直接』やりとりできる。これらが一時変数であった場合...初期化されていないiを読み出そうとすると、未定義の動作となる。初期化されていないpを読み出そうとすると、未定義の動作となる。初期化されていないppを読み出そうとすると、未定義の動作となる。変数の扱いに関しては、intとcharやdoubleの違いとかと大して変わらないのだけれど、ポインタ変数の読み書きという話題が出ると、「アドレスを格納してないポインタ変数を参照しちゃいかん」と脊髄反射的に騒ぎ出すひとがしばしば現れる。iもpもppも未初期化の一時変数だとしてpp=&p;p=&i;に何の問題もないことをどう説明するの。ポインタを使った間接参照があたかも直接参照と排他であるかのようなミスリードを誘う解説が世の中にあふれているのが混乱の原因だと思う。そもそもポインタという存在に非があるかのようなポインタに対する否定的ムードが形成されていることがこの問題を長引かせていると思う。*」は(どちらもポインタに関係する、という以外は)全く別の意味を表しており、たまたま同じ記号を使っているに過ぎない、と覚えるのがなんとか一貫した説明になります。「*p」は、アドレスpが指す先を示す記号として一貫性が保たれています。p」は「*p」(アドレスpの指す先)がint型である宣言。式中に「*p」が出て来たとしても、それは同じくアドレスpが指す先です。同じ記号で違う意味を持つ例としては、乗算演算子「*」の方ですね。↑1年前オフトピック前言時の*はポインタ宣言子。変数名(直接宣言子)には含まれない。ポインタ宣言子ではありません。変数名(直接宣言子)に含まれないのは当然です。宣言指定子であり、型指定子です。宣言子であり、直接宣言子であり、識別子(変数名)です。宣言子であり、ポインタ宣言子です。宣言子であり、ポインタ宣言子です。ポインタ宣言子ではありません。宣言子であり、識別子(変数名)です。宣言子であり、配列宣言子です。配列宣言子ではありません。宣言子であり、識別子(変数名)です。↑1年前オフトピック変数の扱いに関しては、intとcharやdoubleの違いとかと大して変わらないのだけれど、ポインタ変数の読み書きという話題が出ると、「アドレスを格納してないポインタ変数を参照しちゃいかん」と脊髄反射的に騒ぎ出すひとがしばしば現れる。iもpもppも未初期化の一時変数だとしてpp=&p;p=&i;に何の問題もないことをどう説明するの。脊髄反射的に騒ぎ出す人は、「アドレスを格納してないポインタ変数を使って、ポインタの指している先のオブジェクトを参照しちゃいかん」と言っているつもりなんでしょう。いう使い方をしちゃいかん、と言っているのでしょう。未初期化の一時変数であっても何も問題ありません。1年前>かずまさんご指摘ありがとうございます。宣言に現れる*単体の名称は存在しないわけですね。脊髄反射的に騒ぎ出す人は、「アドレスを格納してないポインタ変数を使って、ポインタの指している先のオブジェクトを参照しちゃいかん」と言っているつもりなんでしょう。いう使い方をしちゃいかん、と言っているのでしょう。未初期化の一時変数であっても何も問題ありません。して、ポインタの指している先のオブジェクトの話なんて一切してないときに、ポインタの指している先のオブジェクトの話を持ち出すひとが、あとからあとから湧いて出るのか、というのを気にしてるんですけどね。話が噛み合うはずもなく紛糾して、それがポインタが難解だというイメージに結び付けられて何もいいことない。指令出来ないものですかねできます。0;}という感じになります。);「intの値」が入るpには、「int型変数のアドレス」は入れられません。同じ数値でも、intの1と、アドレスの1は、意味が違うので、そのままでは入れられません。)でキャストしてpに代入しています。