一.基礎
1.指標和引用的不同
從組合語言來看,乙個指標和乙個引用實現是相同的,他們都存放了乙個位址。
但c++的高階語言特性賦予了引用和指標在使用上的差異
(1).引用必須初始化,必須依賴另乙個物件才能存在,是另乙個物件的別名
(2).引用初始化之後不能被改變;指標可以改變所指的物件
(3).「sizeof 引用」得到的是所指向的變數(物件)的大小,而「sizeof 指標」得到的是指標本身的大小;
(4).指標常量本身(以p為例)允許定址,即&p返回指標常量(常變數)本身的位址,被引用物件用*p表示;引用變數本身(以r為例)不允許定址,&r返回的是被引用物件的位址,而不是變數r的位址(r的位址由編譯器掌握,程式設計師無法直接對它進行訪問),被引用物件直接用r表示。
2.指標與記憶體關係
指標變數儲存的是乙個記憶體中的位址,指標變數本身也有乙個在記憶體中的位址
&p 指標自己的位址
p 指標儲存的位址
4.static、const、#define的用法和區別
static
(1).隱藏
所有未加static字首的全域性變數和函式都具有全域性可見性,其它的原始檔也能訪問
如果加了static,就會對其它原始檔隱藏
(2).static的第二個作用是保持變數內容的持久。(static變數中的記憶功能和全域性生存期)
儲存在靜態資料區的變數會在程式剛開始執行時就完成初始化,也是唯一的一次初始化。共有兩種變數儲存在靜態儲存區:全域性變數和static變數,只不過和全域性變數比起來,static可以控制變數的可見範圍,說到底static還是用來隱藏的。
(3).static的第三個作用是預設初始化為0(static變數)
const的作用
5.記憶體模型
從上到下
核心虛擬記憶體區
使用者棧(向下生長)
|共享庫區域
|堆 (向上生長)
讀寫資料段(.data,.bss)
唯讀**段(.text,rodata)
6.棧和堆分配
棧是由系統自動分配的,堆由程式設計師申請
棧的大小一般是固定的,堆的大小是可變的
堆會產生碎片
C 面試常見問題
1.引用和指標的區別 區別 1 引用不能為空,指標可以為空 2 引用必須初始化,指標不需要 3 引用初始化以後不能改變,指標可以改變初始化物件後的值 4 引用訪問物件後是直接訪問,指標訪問物件是間接訪問 5 引用大小是所引用物件的大小,指標大小是指標類本身的大小 6 引用沒有const,指標有con...
C 面試常見問題
智慧型指標的作用是管理乙個指標,因為存在以下這種情況 申請的空間在函式結束時忘記釋放,造成記憶體洩漏。使用智慧型指標可以很大程度上的避免這個問題,因為智慧型指標就是乙個類,當超出了類的作用域是,類會自動呼叫析構函式,析構函式會自動釋放資源。所以智慧型指標的作用原理就是在函式結束時自動釋放記憶體空間,...
C 面試常見問題(五)
使用動態庫進行鏈結。動態庫 so dll 具體的區別下面這篇部落格講得比較詳細。大家可以移步至 c 靜態庫與動態庫 因此乙個物件的大小 所有非靜態成員大小的總和 由以上分析可以得到菱形繼承物件的記憶體大小問題 includeusing namespace std class a 大小為8,int 4...