1. 指針和引用的區別
- 指針保存的是所指對象的地址,引用是所指對象的別名,指針需要通過解引用間接訪問,而引用是直接訪問
- 指針可以改變地址,從而改變所指的對象,而引用必須從一而終;
- 引用在定義的時候必須初始化,而指針則不需要;
- 指針可以為空,引用不能為空
- 可以有const指針,沒有const引用
?
2. 頭文件中的 ifndef/define/endif 是干什么用的? 該用法和 program once 的區別?
相同點:
- 它們的作用是防止頭文件被重復包含。
不同點
- ifndef 由語言本身提供支持,但是 program once一般由編譯器提供支持,也就是說,有可能出現編譯器不支持的情況(主要是比較老的編譯器)。
- 通常運行速度上 ifndef 一般慢于 program once,特別是在大型項目上, 區別會比較明顯,所以越來越多的編譯器開始支持 program once。
- ifndef 作用于某一段被包含(define 和 endif 之間)的代碼, 而 program once 則是針對包含該語句的文件, 這也是為什么 program once 速度更快的原因。
- 如果用 ifndef 包含某一段宏定義,當這個宏名字出現“撞車”時,可能會出現這個宏在程序中提示宏未定義的情況(在編寫大型程序時特性需要注意,因為有很多程序員在同時寫代碼)。相反由于program once 針對整個文件, 因此它不存在宏名字“撞車”的情況, 但是如果某個頭文件被多次拷貝,program once 無法保證不被多次包含,因為program once 是從物理上判斷是不是同一個頭文件,而不是從內容上。
?
?
3 當i是一個整數的時候++i和i++那個更快一點?i++和++i的區別是什么?
答:理論上++i更快,實際與編譯器優化有關,通常幾乎無差別。
//i++實現代碼為:
int operator++(int)
{int temp = *this;++*this;return temp;
}//返回一個int型的對象本身// ++i實現代碼為:
int& operator++()
{*this += 1;return *this;
}//返回一個int型的對象引用
i++和++i的考點比較多,簡單來說,就是i++返回的是i的值,而++i返回的是i+1的值。也就是++i是一個確定的值,是一個可修改的左值,如下使用:
cout << ++(++(++i)) << endl;
cout << ++ ++i << endl;
這里有很多的經典筆試題,一起來觀摩下:
#include <iostream>
using namespace std;int main()
{int i = 1;printf("%d,%d\n", ++i, ++i); //3,3printf("%d,%d\n", ++i, i++); //5,3printf("%d,%d\n", i++, i++); //6,5printf("%d,%d\n", i++, ++i); //8,9return 0;
}
輸出結果:
分析:
- 首先是函數的參數入棧順序從右向左入棧的,計算順序也是從右往左計算的,不過都是計算完以后再進行的壓棧操作:
- 對于第1個printf,首先執行++i,返回值是i,這時i的值是2,再次執行++i,返回值是i,得到i=3,將i壓入棧中,此時i為3,也就是壓入3,3;
- 對于第2個printf,首先執行i++,返回值是原來的i,也就是3,再執行++i,返回值是i,依次將3,5壓入棧中得到輸出結果
- 對于第3個printf,首先執行i++,返回值是5,再執行i++返回值是6,依次將5,6壓入棧中得到輸出結果
- 對于第4個printf,首先執行++i,返回i,此時i為8,再執行i++,返回值是8,此時i為9,依次將i,8也就是9,8壓入棧中,得到輸出結果。
上面的分析也是基于VS搞的,不過準確來說函數多個參數的計算順序是未定義的(the order of evaluation of function arguments are undefined)。筆試題目的運行結果隨不同的編譯器而異
?
4.?
- ## 引用是否占用內存空間? ##(自娛自樂,僅供參考?
2. 引用占用內存空間嗎?
如下代碼中對引用取地址,其實是取的引用所對應的內存空間的地址。這個現象讓人覺得引用好像并非一個實體。但是引用是占用內存空間的,而且其占用的內存和指針一樣,因為引用的內部實現就是通過指針來完成的。
// 比如 Type& name; <===> Type* const name。
int main(void)
{int a = 8;const int& b = a;int* p = &a;*p = 0;cout << a; //output 0return 0;
}
?
參考資料
1.?C/C++常見面試知識點總結附面試真題----20190407更新