為什么C/C++語言使用指針?
①一方面,每一種編程語言都使用指針册踩。不止C/C++使用指針。每一種編程語言都使用指針效拭。C++將指針暴露給了用戶(程序員)暂吉,而Java和C#等語言則將指針隱藏起來了。
“Everything uses pointers. C++ just exposes them rather than hiding them,”It's easier to give someone an address to your home than to give a copy of your home to everyone.
②另一方面使用指針的優(yōu)點和必要性:
- 指針能夠有效的表示數(shù)據(jù)結(jié)構(gòu)缎患;
- 能動態(tài)分配內(nèi)存慕的,實現(xiàn)內(nèi)存的自由管理;
- 能較方便的使用字符串挤渔;
- 便捷高效地使
- 用數(shù)組指針直接與數(shù)據(jù)的儲存地址有關(guān)肮街,比如:值傳遞不如地址傳遞高效,因為值傳遞先從實參的地址中取出值判导,再賦值給形參代入函數(shù)計算嫉父;而指針則把形參的地址直接指向?qū)崊⒌刂罚褂脮r直接取出數(shù)據(jù)眼刃,效率提高绕辖,特別在頻繁賦值等情況下(注意:形參的改變會影響實參的值!)
引用和指針有什么區(qū)別擂红?
本質(zhì):引用是別名仪际,指針是地址,具體的:
①從現(xiàn)象上看昵骤,指針在運行時可以改變其所指向的值树碱,而引用一旦和某個對象綁定后就不再改變。這句話可以理解為:指針可以被重新賦值以指向另一個不同的對象涉茧。但是引用則總是指向在初始化時被指定的對象赴恨,以后不能改變,但是指定的對象其內(nèi)容可以改變伴栓。
②從內(nèi)存分配上看伦连,程序為指針變量分配內(nèi)存區(qū)域,而不為引用分配內(nèi)存區(qū)域钳垮,因為引用聲明時必須初始化惑淳,從而指向一個已經(jīng)存在的對象。引用不能指向空值饺窿。注:標準沒有規(guī)定引用要不要占用內(nèi)存歧焦,也沒有規(guī)定引用具體要怎么實現(xiàn),具體隨編譯器 http://bbs.csdn.net/topics/320095541
③從編譯上看,程序在編譯時分別將指針和引用添加到符號表上绢馍,符號表上記錄的是變量名及變量所對應地址向瓷。指針變量在符號表上對應的地址值為指針變量的地址值,而引用在符號表上對應的地址值為引用對象的地址值舰涌。符號表生成后就不會再改猖任,因此指針可以改變指向的對象(指針變量中的值可以改),而引用對象不能改瓷耙。這是使用指針不安全而使用引用安全的主要原因朱躺。從某種意義上來說引用可以被認為是不能改變的指針。
④不存在指向空值的引用這個事實搁痛,意味著使用引用的代碼效率比使用指針的要高长搀。因為在使用引用之前不需要測試它的合法性。相反鸡典,指針則應該總是被測試源请,防止其為空。
⑤理論上轿钠,對于指針的級數(shù)沒有限制巢钓,但是引用只能是一級病苗。如下: int** p1; // 合法疗垛。指向指針的指針 int& p2; // 合法。指向指針的引用 int& p3; // 非法硫朦。指向引用的指針是非法的 int&& p4; // 非法贷腕。指向引用的引用是非法的 注意上述讀法是從左到右。