※ ChatGPTを利用し、要約された質問です(原文:ポインタ宣言と初期設定の書き方について)
ポインタ宣言と初期設定について
このQ&Aのポイント
ポインタ宣言と初期設定についての説明です。C言語初心者向けの解説です。
int *pt = &nn という記述は正しい書き方とされていますが、初学者にとっては分かりにくいと感じることがあります。左辺と右辺のデータ形式が異なるため、違和感を覚えることもあります。実際には int *pt; pt = &nn; という書き方と同じ意味です。
ポインタ宣言と初期設定について、初学者が感じる疑問や違和感についての解説です。左辺と右辺のデータ形式の違いについても触れています。具体的な例文とともに理解を深めることができます。
C言語初心者です。
int nn;
int *pt = &nn;
という記述は正しい書き方だと思いますが、
私には分かりにくく感じるんです。
pt はアドレス
*pt はアドレスptの値
nn は値
&nn はアドレス
アドレス と 値 では、データの形式が違うと思うので、
int *pt = &nn というのは、
左辺は「値」、右辺は「アドレス」という意味で、
なんだか気持ちが悪いわけです。
int *pt = &nn
は、
int *pt;
pt = &nn;
と同値だと思いますが、後者であれば、しっくり来るんですよね。
私は何か間違った理解をしているのでしょうか。
(誤った理解をしているから、「気持ち悪い」と感じるのでしょうか)
この辺り、どなたかご助言下さい。
同じように立ち止まった経験のある方がいらっしゃると嬉しいのですが。
お礼
回答、ありがとうございました。
補足
これまでの回答とはまた違った視点での回答でしたので、 大変興味深く読ませて頂きました。 これまでに頂いた回答を大別すると、 int *pt を どう分けて見るかで、分けられると思いました。 つまり、 (1)int * | pt (2)int | *pt の2通り。(※「|」で区切っている。) 回答NO.1の方は(1)、回答NO.4の方は(2)の考え方であると解釈しました。 結論から先に言うと、 「int *pt = &nn;」は、 「こう書くものなんだ、そのまま頭に入れておけ。そういう仕様だ。」 というのが、C言語利用者の暗黙の了解なのかもしれない、と思ったわけですが、 当初は、この書き方(ルール)に、 何かしらの合理的な理由があるのではないかと思っていました。 そして、いくつか回答を頂き、 私が想定していた「何かしらの合理的な理由」は、 明確に存在しているようでもなく、 「好きなように解釈し、覚えましょう(こじつけでも構いませんから)」 といった考え方で処理すべき事柄なのだと理解しました。 で、その考え方の1つとして、今回頂いた回答NO>4は、 私にとって、とても合点のいくものでした。 こちらの回答の考え方では、核となるものが2点あると感じました。 (1) *pt の型は int型 だから、「int *pt」と宣言するのは、 他の変数を宣言するときの方法と同じ書式と言え、その宣言方法には一貫性がある。 (2) 宣言と同時に初期化するときには、(定義の形)= 初期値; という形にする。 つまり、このルールに従うとすると、 『ポインタ』の宣言方法が「int *pt」というカタチに決まった上で、 その『ポインタ』の初期値を入れる初期化作業では、 右辺には『アドレス』データが来ることになります。 私の最初の理解も、漠然とではありますが、 おそらくこちらと同じ考え方だったと思います。 ただ、それで、はたして良いのだろうか?と思ったわけです。 (2)のルールは、やや強引な感じに思えなくもないですが、 そういうものなんだ、と考えれば、それ以上、悩むことはなさそうです。 実際、この質問で取り上げているポインタの宣言と初期化を同時に行うときの書式について、 「このような誤解し易いと思われる書式を採用したからには、 そのマイナス面をはねのけるだけの理由があるのではないか」 と思っていましたが、それはどうやらなさそうだ、と結論づけました。 と、ごちゃごちゃ書いてきましたが、 私のような違和感を感じる方は、実際、あまりいらっしゃらないのでしょうかね。 以上、駄文をお読み頂き、ありがとうございました。