面試題-指標-引用
問題:
問:引用與指標有什麼區別?
答:
1.引用必須初始化,指標可以不用。
2.引用初始化以後就不能被改變(即只能初始化一次,始終只指向指定的物件),而指標可以改變所指向的物件。
3.不存在指向空值的引用,而指標可以指向一個空值,即空指標。
4.因為引用不能指向空值,這意味著使用引用之前不需要測試其合法性;而指標則需要經常進行測試。所以使用引用的程式碼效率要比使用指標的效率高,同時也使引用具有更高的安全性。
5.引用不佔有記憶體,而指標是佔記憶體的。
6.引用是單個變數的別名,而指標是個實體。
7.sizeof+引用:引用指向的物件的記憶體大小。sizeof+指標變數:指標本身的記憶體大小。
8.引用不存在引用常量,指標存在指標常量。
分析:
void main()
{
int var = 2;
int &reference;//錯誤,引用不能沒有初始化。
int *p;//正確,指標可以不初始化,但是隱含安全性問題,比如由於使用該指標時,它沒有指向某個物件,會造成野指標。
int &reference = var;//正確,指向一個物件,即變數。
int &reference = 0;//錯誤,不能指向空值
int &reference = 2;//錯誤,引用不能指向常量
//////////////////////////////////////////////////////////////
int *p = 0;//正確,指標可以指向空值
int &reference = *p;//不報錯,但是隱含非法,因為p指標是個野指標,當輸出p的值(沒有指向物件的值)就出錯
int &reference = p;//錯誤,int *型別不能初始化int &型別
int &reference = (int &)p;//強轉化型別,與int *無關。
cout << &reference << endl;//&reference 是引用指向變數的地址
cout << reference << endl;//reference 是引用指向變數的值
//////////////////////////////////////////////////////////////
const int &a//是正確的,常引用,表示不能通過常引用來該變指向目標變數的值
int const &a//是錯誤的,引用常量,由於引用本身一旦初始化就不能被改變,並不需要const來宣告。
}
-------------------------------------------------------------------------------------------------------------------------------------------------
問題:
問:下面的程式碼是否正確?
void main()
{
int b=123;
const int &a=b;
b=555;
printf("%d\n",a);
a=666;
}
答:
void main()
{
int b=123;
const int &a=b;//常引用,即引用指向目標變數的值
b=555;
printf("%d\n",a);//輸出結果是555
a=666;//編譯錯誤,不能通過常引用來改變b的值
}
--------------------------------------------------------------------------------------------------------------------------------------------------------
問題:
問:下面程式碼是否正確?若不正確,請問哪條語句是錯的?
void main()
{
int &a=100;
const int &b=100;
}
答:
void main()
{
int &a=100;//錯誤
const int &b=100;//正確
const int &b=100//引用指向的是常量,代表的是引用b指向一個const int型別,這個int型的值是不能被改變的。
int &a=100//100是個立即數,由於立即數不是C語言的常量,立即數本身存在於程式碼段,並不是一個物件或變數,所以引用不能指向它的。
}
--------------------------------------------------------------------------------------------------------------------------------------
問題:
問:下面程式碼哪條語句是錯誤的?
void main()
{
const int ci=1024;
const int &rl=ci;
rl=42;
int &r2=ci;
const int &r3=ci;
const int &r4=r3*2;
}
答:
void main()
{
const int ci=1024;
const int &rl=ci;//正確,引用以其對應的物件都是常量
rl=42;//錯誤,rl是對常量的引用
int &r2=ci;//錯誤,試圖讓一個非常引用指向一個常量物件
const int &r3=ci;//正確
const int &r4=r3*2;//正確
//--------------
//1.常量物件不能被非常引用指向
//2.防止通過常引用來改變目標變數(非常量)的值
}
-----------------------------------------------------------------------------------------------------------------------------------------------------
問題:
問:引用的優勢?
答:
1.引用作為函式引數傳遞時,實際傳遞的是實參,可直接對實參進行改變。而指標作為函式引數傳遞時,傳遞的時實參的地址。根據引用實參的地址來對其進行操作。不管是引用作為函式引數還是其他地方,由於引用是不佔用記憶體並且無須像指標那樣還要定址,節約時間和空間。
2.由於引用一旦定義就必須初始化,還有常引用可以保護指向的目標變數的值不輕易被修改,運用比指標安全。
----------------------------------------------------------------------------------------------------------------------------------------------------
問題(中興面試):
問:設void f1(int *m,long &n);int a;long b;則以下呼叫合法的是()。
A.f1(a,b) B.f1(&a,b)
C.f1(a,&b) D.f1(&a,&b)
答:B
分析:
指標型別的函式引數的作用:將一個變數的地址傳送到函式中,呼叫時,要求實參是一個地址,所以上面的函式,實參前面加取地址符。也可以這樣理解:int *m=&a;
引用作為函式引數的作用:形參是變數名的別名,傳遞資料的作用。呼叫時,要求實參是一個變數名,所以上面的函式,實參直接使用變數名。也可以這樣理解:long &n=b;