C和C 面試秘笈三 引用和指標(1)

2021-08-19 14:25:44 字數 2562 閱讀 6936

引用是c++引入的新語言特性,正確、靈活地使用引用,可以使程式簡潔高效。

一、一般變數的引用

引用只是給變數起了乙個別名,它們兩個儲存在同乙個儲存單元,具有同一位址。

來看下面的**

int a = 10;

int b = 20;

int &rn = a;

int equal;

rn = b;

cout << "a = " << a << endl;

cout << "b = " << b << endl;

rn = 100;

cout << "a = " << a << endl;

cout << "b = " << b << endl;

equal = (&a == &rn) ? 1 : 0;

cout << "equal = " << equal << endl;

這裡將rn作為a的引用,對rn操作就相當於對a進行了相應的操作。因為它們具有相同的儲存單元,所以最後一行輸出的是 equal  = 1;

二、指標變數的引用

其實指標變數的引用和普通變數的引用差不多,都是給它們取了乙個別名。

int a = 1;

int *p = &a;

int *&pa = p;

上面的一段**就是將pa作為p的引用,所以對pa的操作就相當於對p的操作。

三、使用指標引用來交換兩個字串

#include using namespace std;

void swap(char *&x, char *&y)

int main()

上面的**就是利用傳指標的引用實現字串的交換。如果沒有傳遞指標的引用,那麼只是在swap函式中交換了兩個字串,和main函式裡的ap,bp並沒有什麼關係。

四、指標和引用的區別

1、初始化要求不同

引用在建立的同時必須初始化

指標在定義的時候不一定要初始化

2、可修改性不同

引用一旦被初始化為指向乙個物件,它就不能被改變為另乙個物件的引用

指標可以在任何時候改變為指向另乙個物件

3、不存在null引用

引用不能使用指向空值的引用,它必須指向乙個某個物件

指標可以null,不需要總是指向某些物件,可以把指標指向任意的物件

4、測試需要的區別

引用不會指向空值,所以在使用引用前不需要測試它的合法性

指標可以指向任意的物件,所以需要在使用它之前檢測它的合法性

5、應用的區別

如果是指一旦指向乙個物件後就不會改變的指向,那麼應該使用引用

如果存在指向null或在不同的時刻指向不同的物件這些可能性,應該使用指標。

五、指標的加減操作

我們先看下面一段**

#include int main()

; //第一行

int *ptr = (int *)(&a + 1); //第二行

printf("%d\n", *(a + 1)); //第三行

printf("%d\n", *(ptr - 1)); //第四行

return 0;

}

這段**執行的時候會輸出什麼樣的結果呢,我們來分析一下。

第一行宣告了乙個含有五個int型別的陣列,並給這個陣列初始化了。

第二行宣告了乙個int型別的指標,並把a的位址加一賦給了ptr;注意這裡的加一加的是整個a陣列的大小,因為a是含有五個int型別的陣列,所以這裡就是加上了20個位元組;所以ptr指向了a[5];

第三行就是列印了,這裡的a+1和之前&a+1不同,因為這裡的a是陣列的首位址也就是a[0]的位址,加上一就是a[0]的下乙個元素,但是&a是整個陣列的首位址,加上一就是加了整個陣列的大小。所以這裡會輸入2.

第四行,因為ptr指向的是a[5], 所以ptr-1就會指向a[4],然後再用*解引用,就會得到a[4]的值了。

【注意】:注意a + 1和 &a + 1 的區別。 

六、指標常量和常量指標的區別

指標常量就是指標的常量,它的位址不能被改變,但是可以修改其指向的內容。

例:

int * const p;

常量指標是指向常量的指標,它所指向的位址的內容是不可修改的。

例:

int const * p;

const int * p;

七、指標陣列和陣列指標的區別

指標陣列表示乙個陣列,這個陣列的每個元素都是乙個指標。

例:

int *p[5]; //p是乙個含有五個int * 元素的陣列

陣列指標表示乙個指標,這個指標指向乙個陣列。

例:

int (*p)[5]; //p是乙個指向含有五個int型別的陣列的指標。

C (二)引用和指標

引用不是定義乙個新的變數,而是給乙個已經定義的變數重新起乙個別名。定義的格式是 型別 引用變數名 已定義過得變數名 引用的特點 1 乙個變數可以取多個別名 2 引用必須初始化 3 引用只能在初始化的時候引用一次,不能改變為再引用其他的變數。include using namespace std vo...

C 複習(1) 引用和指標的區別

引用在定義時必須初始化,而指標沒有要求。引用在初始化時引用乙個實體後,就不能再引用其他實體,而指標可以在任何時候指向任何乙個同型別實 體。沒有null引用,但有null指標。在sizeof中含義不同 引用結果為引用型別的大小,但指標始終是位址空間所佔位元組個數 32位平台下佔4 個位元組 引用自加即...

C 集錦二 引用和指標

1.什麼是 引用 宣告和使用 引用 需要注意哪些問題?引用就是某個目標變數的 別名 對引用的操作與對變數的操作效果完全相同。宣告乙個引用需要對其進行初始化,這不是新定義了乙個變數,它只是表示該引用名是目標變數名的乙個別名,它本身不是一種資料型別,因此引用不佔儲存單元。2.使用 引用 作為函式引數有哪...