1. 程式人生 > >面試題-指標-引用

面試題-指標-引用

問題:

問:引用與指標有什麼區別?

答:

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;