
No.3ベストアンサー
- 回答日時:
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の値が入るはずなのに…
No.5
- 回答日時:
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' に対して参照が行われました。」といった警告が出ます。
No.4
- 回答日時:
せめて
・どういうファイル名で
・どのコンパイラを使って
・どのようなエラーメッセージが出たか
くらいは書きましょう.
まあ int &k なんて書いてあるから C++ なんでしょうね.
No.2
- 回答日時:
i1,i2 がどういうものかが不明なので、コンパイルエラーの原因まではわかりかねますが…
&k と書いた場合、「k」は普通の変数でなければいけません。
&k で、変数k のポインタ(=メモリアドレスと考えてください)を指します。
*k と書いた場合、「k」はポインタ変数でなければいけません。
ポインタ変数というのは、ポインタ(アドレス)を格納する専用の変数です。
*k でポインタ変数k に格納されているポインタが指している中身を指します。
int *k;
のように宣言すると、k はint型のポインタを格納できるポインタ変数である、ということになります。
int &k = i1;
のような定義はできなかったと思うのですが…(ひょっとしてこれが、コンパイルエラーの原因?)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
ExcelVBAでのkernel32(64bit)
-
ハンドルはポインタか
-
init関数の意味
-
C言語のポインタに直接アドレス...
-
LPSTR型の初期化について
-
fopne で失敗する原因
-
C言語についてです。 独学で進...
-
構造体のアドレス渡し
-
ファイルポインタのヘッダーフ...
-
どうしてエラーになるかわかり...
-
戻り値で構造体を返すことは可...
-
Run-Time Check Failure #3とい...
-
ダイアログから、ドキュメント...
-
無効なポインタ操作のエラー
-
C#,C++/CLI,MFCにおけるデータ...
-
別のDLLのダイアログを・・・
-
関数内、ファイルのstatic変数
-
ReadFileの読み込みエラーについて
-
VB.NET DLL【API関数(コールバ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
セグメントエラー
-
Run-Time Check Failure #3とい...
-
ExcelVBAでのkernel32(64bit)
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
参照型で受け取った引数をポイ...
-
トリプルポインタが必須!とな...
-
ハンドルはポインタか
-
LPSTR型の初期化について
-
ポインターの使用法や利点
-
ポインタについて
-
c言語で任意のファイルから読み...
-
基本アルゴリズムの『返す』の...
-
コンストラクタでnewを失敗した...
-
ハンドル、アドレス、ポインタ...
-
アプリを32bitから64bit移行
-
デバイスハンドルとは?
-
NULLとブランクの違い
おすすめ情報