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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- C言語・C++・C# C言語 ポインタ 配列 2 2022/06/02 17:29
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 変数のスコープ 5 2023/05/27 17:50
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
fopne で失敗する原因
-
C言語のポインタに直接アドレス...
-
Cで作成したDLL関数をVBから呼...
-
Run-Time Check Failure #3とい...
-
init関数の意味
-
TCHAR文字列内の検索について
-
DLL<->VB間での受け渡し(文字...
-
パスからファイル名を抽出
-
DelphiでCreateProcessがうまく...
-
popenした子プロセスのプロセス...
-
for(s=p; *p; p++)の*p(ポイン...
-
VB6でポインタ?
-
構造体とfscanf
-
アプリを32bitから64bit移行
-
構造体の削除について
-
nullポインタを逆参照とは?
-
Vector定義の配列の共有メモリ化
-
ハンドル、アドレス、ポインタ...
-
入れ子の構造体について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
init関数の意味
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
Run-Time Check Failure #3とい...
-
C言語の関数と配列に関する質問
-
LPSTR型の初期化について
-
戻り値で構造体を返すことは可...
-
参照型で受け取った引数をポイ...
-
構造体とfscanf
-
ExcelVBAでのkernel32(64bit)
-
アプリを32bitから64bit移行
-
Cで作成したDLL関数をVBから呼...
-
C言語でのconstを返す関数
-
main(int argc,char **argv[])...
-
DLL<->VB間での受け渡し(文字...
-
エラーの意味
-
PASCALとFARの意味
-
ハンドルはポインタか
-
CWnd::EnableWindow()の扱い方
おすすめ情報