プリン+醤油=ウニみたいな組み合わせメニューを教えて!

C++で、
 int i;
と、
 int i[1];
は、どっちで宣言をしても、iは同じ振るまいですか?

A 回答 (6件)

配列、ポインタなどよりももっと基礎的な概念である「右辺値」、「左辺値」を理解しましょう。



int i ;
この形で宣言されたiは代入式の右辺(代入する値)にも左辺(代入される領域)にも使うことが出来ます。
int a ;
a = i ;
i = 10 ;

C言語でも他のほとんどの言語でも「変数は右辺の時と左辺の時とでは解釈が違う」という原則があります。

代入式の右辺に配置出来るのは『値』です。
変数であっても良いし定数であっても、式であってもかまいません。
左辺がポインタ変数の場合は右辺はアドレス値(またはアドレス式)です。
代入式の右に配置可能な値を右辺値といいます。

代入式の左に配置出来るのは『領域』です。
変数であっても良いし、配列要素でもかまいません。
また、領域を示す式(int i[1]のときの*iなど)でもかまいません。
配列名(int i[1]のときのi)や定数は領域を持たないため、左辺に配置することが出来ません。
代入式の左に配置可能な領域を左辺値といいます。

int i[1] ;
この形で宣言されたiは右辺値に利用できます。
int *a ;
a = i ;
しかし、iだけでは領域を持たないため左辺値になりえません。
i = 1 ; //コンパイルエラーが出る。

コンパイル時に「有効な左辺値でない」と言う意味のエラーが出るのは「領域を示さない値を左辺値として使っている時」です。

どちらかと言うと「基礎理論」の部類なのでプログラム言語の本などには書いてないのですが、実は最も大切なのが「基礎理論」です。
頑張って勉強してください。
    • good
    • 1
この回答へのお礼

右辺値と左辺値、それから、配列はポインタであることと、変数の領域についてのことが勉強になりました。
ありがとうございました。

お礼日時:2003/02/19 01:59

前者のiは単純変数、


後者のiは配列の先頭アドレス
です。
当然振る舞いは違います。

前者
int i;
int a;
int *b;
a=i;
b=&i;

後者
int i[1];
int a;
int *b;
a=i[0];
b=i;
b=&i[0];

となります。

この回答への補足

 

補足日時:2003/02/19 01:56
    • good
    • 0

違います。

←回答。
感想→でも、コンパイルして、出来上がるマシン語は、もしかしたら、同じになる(こともある)かもしれないですね。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2003/02/19 01:59

配列とかポインタが理解できていないようですね。


http://homepage1.nifty.com/toshio-k/prog/c/array …
    • good
    • 0

違います。


「int型の領域1個が確保される」ことは同じですが、
それにアクセスするとき、
前者は「i」だけで使えるけど、
後者の宣言をした場合「i[0]」として使わないといけません。
後者の宣言をしてただ「i」と書いた場合、配列iの先頭のアドレスが
得られます。
また代入はできません。
型としても違います。前者の「i」はint型なのに対し、
後者の「i」は「intの配列型」です。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2003/02/19 01:59

int iで宣言したほうはそのまま


そのままi=0などのように使えますが、

int i[1]で宣言したほうは
i[0]=0 や *i=0 のように記述しないと使えませんよ。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2003/02/19 01:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報