為什么調用函數(shù)的時候,有些情況下要傳地址?傳地址有什么好處?
首先有一種情況,是必須要傳地址的,比如交換兩個數(shù)字。
voidswap(int*x,int*y) { int t = *x; *x = *y; *y=t; } int main() { int a = 1, b = 2; swap(&a, &b); return 0; }凡是這種涉及到在函數(shù)內部修改實參值的,都得要傳地址才行,通過地址來間接得修改。
再比如我們前兩天講的,函數(shù)如何返回多個數(shù)據(jù),也可以提前申請好一塊內存,把內存的地址傳過去,然后把要返回的多個數(shù)據(jù)保存在這塊內存中,也能解決問題。
voidtest(int*a) { /*結果保存在a中*/ } int main() { intresult[5] = {0}; test(result); return 0; }除了這種必須傳地址的情況,剩下的可以傳地址,也可以不傳地址,但是傳地址的話有時候效率更高。
struct Test { int a[1024]; };比如我們寫代碼的時候經(jīng)常用到結構體,我寫的這個結構體占了4096字節(jié),如果直接傳值,那么形參也要分配4096個字節(jié),而且還得把實參的數(shù)據(jù)拷貝過來。
但是如果換成地址傳遞,形參只需要4個字節(jié)或者8個字節(jié),保存結構體的地址就行,這種方式,將會大大提高函數(shù)調用的效率。
如果結構體再大一些,比如他要占用兆級別的內存空間,如果還是傳值,那程序就會很容易奔潰,因為程序的棧空間是有限的,在Linux中默認是8M,過度使用的話,很容易超出它的限制,結果就會不可控。
所以調用函數(shù)的時候應該選擇傳值還是傳地址,沒有固定的說法。
傳值操作簡單,通俗易懂,但是對于一些復雜的類型,浪費時間也浪費空間。
?
傳地址雖然理解起來困難一些,但它能在函數(shù)內部去訪問實參,對于一些復雜的類型,既能提高調用的效率,又能節(jié)省空間。
?
審核編輯:劉清
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
Linux系統(tǒng)
+關注
關注
4文章
593瀏覽量
27403 -
LINUX內核
+關注
關注
1文章
316瀏覽量
21651
原文標題:值傳遞和地址傳遞
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
C語言指針做函數(shù)參數(shù),指針做函數(shù)返回類型
有時候我們可以使用函數(shù)的返回值來回傳數(shù)據(jù),在簡單的情況下是可以的,但是如果返回值有其它用途(例如返回函數(shù)
發(fā)表于 10-24 10:42
?601次閱讀
esp-wroom-32如何在不使用wifi功能的情況下獲取mac地址?
你好
我想檢查 esp-wroom-32 模塊的mac_address。
我已經(jīng)通過初始化wifi然后調用函數(shù)來esp_get_mac檢查了它。
但是,如果我想在不使用 wifi 功能的情況下獲取該 mac
發(fā)表于 07-19 09:37
函數(shù)傳參數(shù)據(jù)出錯
我在CubSuite+里建了個.c和.h,里面函數(shù)里傳參數(shù)時,單步調試發(fā)現(xiàn),傳過去去的數(shù)值不對,而在主函數(shù)里調用又傳對了,這是什么鬼???
發(fā)表于 08-08 17:26
labview 中怎么獲取數(shù)值的指針(地址)?調用dll時要往里面傳地址
labview 中怎么獲取數(shù)值的指針(地址)?調試一個設備,調用dll時要往里面傳地址,看了官方.h文件,參考了官方的C#代碼,自己用lab
發(fā)表于 03-15 08:59
IP地址,IP地址是什么意思
IP地址,IP地址是什么意思
基本定義 IP地址都是一個十分重要的概念,INTERNET的許多服務和特點都是通過IP地址體現(xiàn)出來的。
發(fā)表于 04-03 15:12
?1675次閱讀
C語言回調函數(shù)學習
對指針的應用是C語言編程的精髓所在,而回調函數(shù)就是C語言里面對函數(shù)指針的高級應用。簡而言之,回調函數(shù)是一個通過函數(shù)指針調用的
發(fā)表于 05-27 09:44
?7206次閱讀
C語言函數(shù)中的傳值和傳指針到底有什么區(qū)別
我們可能聽過C語言中的傳值和傳指針,在其他語言中,也有傳引用一說,那么他們到底有什么區(qū)別呢?如果你還不能準確地分辨,就該好好了解一下了。
C語言-函數(shù)的定義、聲明、傳參
C語言里函數(shù)是非常重要的知識點,一個完整的C語言程序就是由主函數(shù)和各個子函數(shù)組成的,主函數(shù)調用子函數(shù)
使用LPNDR_ReadGlobalInfo函數(shù)塊讀取IP地址和MAC地址
使用 LPNDR_ReadGlobalInfo 函數(shù)塊可以讀取 PROFINET 設備的 IP 地址和 MAC 地址。
DNS解析一個地址的時候會返回多個IP嗎?
要實現(xiàn)一個域名對應多個 IP 地址的效果,只需要在 DNS 解析操作平臺,添加一條解析記錄,將網(wǎng)站的域名指向服務器的 IP 地址。一般情況下,一個域名對應一個 IP
什么情況下避免使用系統(tǒng)調用
制。如果對變量的每次訪問都使用上述機制,由于系統(tǒng)調用會陷入內核空間,需要頻繁的進行上下文切換,這就導致了程序的時間開銷比較大。 自然的,我們就想到,在多線程環(huán)境中,在某些情況下是否能減少甚至避免使用系統(tǒng)調用?答案是肯
什么情況下IP地址會相同?
呈現(xiàn)的是路由器的公網(wǎng)IP地址,所以當我們進行外部通信的時候,它們在這一層面的IP地址相同。 簡單來說,你在家里和家人所有的設備都是通過家里的路由上網(wǎng),對于外部的網(wǎng)站來說,他們的IP地址
評論