C言語のポインタ*と参照を深く理解する&


まずタイプ変換に関する面接問題で、float変数をint型とint&出力に強制的に変換した結果を要求します.
int test()
{
	float a = 1.0f;
	cout<<"value of (int)a is "<<(int)a<<endl;
	cout<<"value of &a is "<<&a<<endl;
	cout<<"value of (int &)a is "<<(int &)a<<endl;
	cout<<boolalpha<<((int)a == (int &)a)<<endl;
	return 0;
}

以前はプログラミングで強制変換(int)variableがよく使われていましたが、前例ではfloat型の値1.0をint型出力1としていましたが、(int&)variableをどのように理解するか、なぜ出力が大きな整数106553216になるのでしょうか.ここでは&の2つの役割を区別する必要があります:アドレスと参照を取ります.以下はCSDNフォーラムを参照して詳しく説明します.(int)aは実際には浮動小数点数aをパラメータとして整数数を構築しており、この整数の値は1であり、(int&)aはコンパイラにaを整数として見るように伝える(実質的な変換は行われていない).1が整数で格納されるのと浮動小数点で格納されるのとではメモリデータが異なるため、両者は等しくない.対float b=0.0 f;の2つの変換の意味は同じであるが、0の整数形式と浮動小数点形式はメモリデータが同じであるため、この特殊な場合、両者は等しい(数値的な意味でのみ).注意、プログラムの出力は(int&)a=106553216と表示されますが、この値はどのようにして来たのでしょうか.前述したように、1はメモリに浮動小数点数形式で格納され、ieee 754で規定され、その内容は0 x 000803 F(バイト逆シーケンスが考慮されている)である.これは,aという変数が占めるメモリセルの値である.(int&)aが現れると、「このアドレスを整数として見なさい.元は何であっても構わない」というコンテキストを教えることに相当します.このように、コンテンツ0 x 000803 Fは整数で解釈され、その値はちょうど106553216(10進数)である.アセンブリコードを表示することによって、「(int)aはaに等しい整数数を再構築することに相当する」という説を確認することができ、(int&)の役割はcout<<および==の正しいリロードバージョンを選択することを意味する1つのタイプの情報を表すだけである.
変数にポインタ*と参照&を使用する例を見てみましょう.&は主に変数の宣言に使用されます.つまり、この変数を別名として使用し、2つの変数のメモリアドレスは完全に同じです.次にint*a,int&b,int*&c,int&*dの実験と簡単な説明を行う.
int test()
{
	int i = 10;
	int *a = &i;	/* a     ,  i   , &    */
	cout<<"value of a is "<<a<<endl;	/* i    */
	int &b = i;		/* b   , i      ,   i    */
	cout<<"value of b is "<<b<<endl;	/* i   ,10 */
	cout<<"value of &b is "<<&b<<endl;	/* i    */
	int * &c = a;	/* c   ,        ( a  ) */
	cout<<"value of c is "<<c<<endl;	/* c a    */
	/* int & *d = b;	d     ,       ,       */
	return 0;
}