-
基本數(shù)據(jù)類型和結(jié)構(gòu)體等值類型:
- 當(dāng)你將基本數(shù)據(jù)類型(如整數(shù)、浮點(diǎn)數(shù)等)或結(jié)構(gòu)體等值類型作為參數(shù)傳遞給函數(shù)時(shí),實(shí)際上傳遞的是它們的值。
- 在函數(shù)內(nèi)部對參數(shù)進(jìn)行修改不會(huì)影響原始值,因?yàn)楹瘮?shù)獲得的是傳遞值的副本。
-
指針類型和引用類型:
- 當(dāng)你將指針類型(如指針、引用等)作為參數(shù)傳遞給函數(shù)時(shí),實(shí)際上傳遞的是內(nèi)存地址,即指向原始變量(對象)的指針。
- 在函數(shù)內(nèi)部通過指針或引用修改其所指向的內(nèi)容(或?qū)ο螅?huì)影響原始變量(對象),因?yàn)樗鼈児蚕硐嗤膬?nèi)存地址。
這種行為在 C 和 C++ 中是一樣的,但在 C++ 中還存在引用類型,它可以讓你以更直觀的方式操作對象,而不用顯式地使用指針。在 Objective-C 中,對象是通過指針來傳遞的,因此與 C 中的指針行為類似。
關(guān)于對象:C+ 的對象是引用類型,OC 是指針類型的對象:
C++ 中的對象可以通過引用類型來傳遞,而 Objective-C 中的對象則是通過指針類型來傳遞的。
在 C++ 中,你可以使用引用類型來傳遞對象,這使得代碼更加簡潔清晰。例如:
void modifyValue(int &x) {
x = 10;
}
int main() {
int num = 5;
modifyValue(num);
// num 的值現(xiàn)在變成了 10
return 0;
}
而在 Objective-C 中,對象是通過指針來傳遞的。例如:
@interface MyClass : NSObject
@property int value;
@end
@implementation MyClass
@end
void modifyObject(MyClass *obj) {
obj.value = 10;
}
int main() {
MyClass *myObject = [[MyClass alloc] init];
myObject.value = 5;
modifyObject(myObject);
// myObject 的 value 現(xiàn)在變成了 10
return 0;
}
在 Objective-C 中,myObject 是一個(gè)指向 MyClass 對象的指針,因此在 modifyObject 函數(shù)中通過指針訪問對象的成員變量。
關(guān)于對象在堆內(nèi)存的分配:
??在 Objective-C 中,通過 [[MyClass alloc] init] 創(chuàng)建的對象是在堆上分配的內(nèi)存,而對象的指針則是在棧上分配的。當(dāng)你將一個(gè)對象指針賦值給另一個(gè)對象指針時(shí),它們都指向相同的堆上的內(nèi)存地址,因此它們指向同一個(gè)對象。
例如,當(dāng)你執(zhí)行 myObject2 = myObject; 時(shí),myObject2 將會(huì)指向與 myObject 相同的堆上的對象,而不是創(chuàng)建一個(gè)新的對象。因此,無論你通過 myObject 還是 myObject2 修改對象的成員變量,這種修改都會(huì)影響到同一個(gè)對象,因?yàn)樗鼈儗?shí)際上都指向了同一個(gè)內(nèi)存地址。
在C里函數(shù)形參列表傳指針類型一般是為了打破方法棧的隔離
??在 C 語言中,通過傳遞指針類型參數(shù),可以在函數(shù)之間共享數(shù)據(jù),并且能夠在函數(shù)調(diào)用中修改原始數(shù)據(jù),這有助于打破方法棧的隔離。
具體來說,通過傳遞指針,可以讓多個(gè)函數(shù)共享同一塊內(nèi)存地址上的數(shù)據(jù),這樣就可以在函數(shù)調(diào)用之間傳遞大量的數(shù)據(jù)而無需復(fù)制。另外,通過傳遞指針還可以在函數(shù)內(nèi)部修改原始數(shù)據(jù),這樣就可以實(shí)現(xiàn)更靈活和高效的數(shù)據(jù)處理方式。
然而,需要注意的是,傳遞指針也可能帶來一些問題,比如可能會(huì)導(dǎo)致程序中的錯(cuò)誤或者安全漏洞。因此,在使用指針時(shí),需要小心謹(jǐn)慎地處理,并確保正確地管理內(nèi)存。
亂傳遞指針帶來的負(fù)面影響:
??使用指針傳遞數(shù)據(jù)的一個(gè)潛在風(fēng)險(xiǎn)就是數(shù)據(jù)被意外地修改。如果不小心修改了指針指向的內(nèi)存地址,可能會(huì)導(dǎo)致程序中的不可預(yù)測的行為或者安全問題。這種情況通常被稱為指針錯(cuò)誤或指針漏洞。
為了避免這種問題,需要在編程時(shí)注意以下幾點(diǎn):
- 確保指針的有效性:在使用指針之前,始終檢查指針是否為 NULL 或者是否指向有效的內(nèi)存地址。
- 限制指針的范圍:只在需要的時(shí)候?qū)⒅羔槀鬟f給函數(shù),并盡量避免在不必要的情況下共享指針。
- 明確指針的用途:確保指針的修改是有意義的,并且對于修改指針?biāo)赶虻膬?nèi)存區(qū)域時(shí)要十分謹(jǐn)慎。
- 使用指針安全函數(shù):在C語言中,可以使用一些安全函數(shù)來處理指針,比如
memcpy、memset等,以減少指針錯(cuò)誤的發(fā)生。
通過遵循這些最佳實(shí)踐,可以最大程度地減少指針錯(cuò)誤的發(fā)生,從而提高程序的穩(wěn)定性和安全性。