dポイントプレゼントキャンペーン実施中!

int i=1;
int j=2;

int &k = i1;//これはOK。
k = i2;//コンパイルエラーになります。

まず、「*k」ではくて、「&k」とはいったい何なんでしょうか?(ポインタ?)
あと、上のコンパイルエラーはどうして起こるのでしょうか?

A 回答 (5件)

C言語の仕様では、


int &k = i1;
というような書き方はできません。

C++の仕様では可能です。つーか、関数の引数として宣言するのでなければこの形でしか使用できません。
これは、参照型変数を宣言しています。i1という変数と同じアドレスを参照する変数としてkを宣言しているのです。
この宣言の後、kに対する変更はi1に対しても行われ、逆にi1に対する変更はkに対しても行われます。…まあ、同じアドレスを参照しているのですから当然ですが。

…こんなことをして何が楽しいのか、ただ単に別名をつけただけで、別名の変更が元の変数に及ぶのなら元の方をいじった方が早いじゃないか、って思っていますね。
そう、同じ関数の中ならば、ほとんど意味がありません。
でも、関数の引数として使った場合、その効果が現れます。

たとえば、数値の交換関数をこのように書くと×です。
swap1( int a, int b )//呼び出した側では交換されていない
{
int temp = a;
a=b;
b=a;
}

この場合、こう書くのがCでの方法です。
swap2( int *a, int *b )//呼び出し側ではswap(&a,&b)と書く
{
int temp = *a;
*a=*b;
*b=*a;
}

が、C++ではこういう風にもかけます。
swap2( int &a, int &b )//呼び出し側ではswap(a,b)と書く:&がいらない
{
int temp = a;
a=b;
b=a;
}

それ以外にも、ポインタは必ずNULL判定をしてから使用しないと思わぬ結果を招きますが、参照ではひねくれたことをしない限り有効な値が入っていることが言語仕様上保証されています。

…それにしてもコンパイルエラーはなぜ起きたんだろう。この場合、k(そしてi1)にはそのときのi2の値が入るはずなのに…
    • good
    • 0

int &k = i1;


と書いた場合、変数kは変数i1への参照となります。
ただし、これは、C++の使える記述で、Cだと参照という概念自体使えません。
参照というのはこの場合、別名の意味になりますので、
k = 2;
とすると、i1の値も、2となります。
つまり、kとi1は常に同じ値となります。
参照は、関数の中で定義するときは、初期化の時にしか使えません。
pString = &chBuffer;
などと、書いた場合は、&はポインタとして使われますが、変数の宣言と初期化のときに
int &k = i1;
と書いた場合は、ポインタとは違いますので、注意してください。
あと、コンパイルエラーについてですが、よくわかりませんが、i2が宣言されていて、ちゃんと値が代入されているかどうかチェックしてみてください。

私の使っているコンパイラでは、
int i1 = 2;
int i2;
int &i = i1;
i = i2;
のようなコードを書くと、「値が割り当てられていないローカルな変数 'i2' に対して参照が行われました。」といった警告が出ます。
    • good
    • 0

せめて


・どういうファイル名で
・どのコンパイラを使って
・どのようなエラーメッセージが出たか
くらいは書きましょう.

まあ int &k なんて書いてあるから C++ なんでしょうね.
    • good
    • 0

i1,i2 がどういうものかが不明なので、コンパイルエラーの原因まではわかりかねますが…



&k と書いた場合、「k」は普通の変数でなければいけません。
&k で、変数k のポインタ(=メモリアドレスと考えてください)を指します。

*k と書いた場合、「k」はポインタ変数でなければいけません。
ポインタ変数というのは、ポインタ(アドレス)を格納する専用の変数です。
*k でポインタ変数k に格納されているポインタが指している中身を指します。

int *k;
のように宣言すると、k はint型のポインタを格納できるポインタ変数である、ということになります。

int &k = i1;
のような定義はできなかったと思うのですが…(ひょっとしてこれが、コンパイルエラーの原因?)
    • good
    • 1

i1, i2 は何ですか?

    • good
    • 0

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