Cポインタに関する多くの混乱は、言語の構文の非常に悪い小さな選択によって裏付けられた、コーディングスタイルに関して最初に行われた非常に悪い選択から生じます。
int *x = NULL;
正しいCですが、それは非常に誤解を招くものであり、私は無意味だとさえ言います。そしてそれは多くの初心者にとって言語の理解を妨げてきました。それは、後に私たちができること*x = NULL;
はもちろん不可能だと考えるようになります。ご覧int
のとおり、変数の型はでなく*x
、変数の名前もでありません。また*
、宣言内のは、と連携して機能的な役割を果たしません=
。それは純粋に宣言的です。だから、もっと理にかなっているのはこれです:
int* x = NULL;
これも正しいCですが、元のK&Rコーディングスタイルに準拠していません。これにより、型がint*
であり、ポインター変数がx
であることが完全に明らかになります。そのため、値NULL
がにx
ポインターとして格納されていることを、初心者でも明らかですint
。
さらに、これはルールの導出を容易にします。スターが変数名から離れている場合、それは宣言ですが、名前に付けられているスターはポインター逆参照です。
だから、今ではさらに下には、我々はいずれかを実行できることをたくさんより理解なっx = NULL;
たり*x = 2;
、他の言葉で、それは簡単にどのように見るため、初心者になりvariable = expression
、リードするpointer-type variable = pointer-expression
とdereferenced-pointer-variable = expression
。(初心者にとって、「式」とは「右辺値」を意味します。)
言語の構文での残念な選択は、ローカル変数を宣言するときにint i, *p;
、整数と整数へのポインターを宣言することができるため*
、が名前の有用な部分であると考えるようになるということです。しかし、そうではありません。この構文は、風変わりな特別なケースであり、便宜上追加されたものです。私の意見では、上に提案したルールが無効になるため、存在しないはずです。私の知る限り、この構文に意味があるのはこの言語の他のどこにもありませんが、たとえそうであっても、Cでのポインター型の定義方法の不一致を指しています。構造体メンバーなどでは、のtype* pointer-variable
代わりにとしてポインターを宣言できますtype *pointer-variable
。それは完全に合法であり、より理にかなっています。
int *x = whatever;
と何をするかの間には非常に混乱する違いがint *x; *x = whatever;
あります。int *x = whatever;
実際には同じように動作しint *x; x = whatever;
ません、*x = whatever;
。