c編程指針的定義 c語(yǔ)言數(shù)組和指針的存儲(chǔ)區(qū)別?
c語(yǔ)言數(shù)組和指針的存儲(chǔ)區(qū)別?區(qū)別:C語(yǔ)言把內(nèi)存分為四個(gè)區(qū)域,它在內(nèi)存的堆棧區(qū)域存儲(chǔ)一般的變量和數(shù)組,所以數(shù)組在C語(yǔ)言的定義中只是一組相同類型的常用變量,即使這個(gè)變量可能是指針。所以它的作用比指針小很多
c語(yǔ)言數(shù)組和指針的存儲(chǔ)區(qū)別?
區(qū)別:C語(yǔ)言把內(nèi)存分為四個(gè)區(qū)域,它在內(nèi)存的堆棧區(qū)域存儲(chǔ)一般的變量和數(shù)組,所以數(shù)組在C語(yǔ)言的定義中只是一組相同類型的常用變量,即使這個(gè)變量可能是指針。所以它的作用比指針小很多,指針可以指向任何區(qū)域的任何數(shù)據(jù),所以你會(huì)覺(jué)得指針很像數(shù)組名,但是必須注意數(shù)組名只是指針中的一個(gè),只指向堆棧區(qū)域,指針的移動(dòng)范圍有限,也就是數(shù)組長(zhǎng)度。而且,數(shù)組在定義之初就有自己的內(nèi)存。如果通用指針不指向某個(gè)內(nèi)存塊,那么它就沒(méi)有自己的內(nèi)存,也就是所謂的野指針。
聯(lián)系:如上所述,數(shù)組只是一個(gè)定義在堆棧區(qū)的連續(xù)變量,它的第一個(gè)地址是指針。
總結(jié):不僅數(shù)組有指針,所有變量都有指針。指針是內(nèi)存中的地址,就像一個(gè)房間必須有房間號(hào)一樣。在C/C語(yǔ)言中定義一個(gè)指針,就是在堆棧區(qū)打開(kāi)一個(gè)內(nèi)存空間來(lái)存儲(chǔ)它所指向的內(nèi)存地址,然后給指針賦值,也就是把地址值賦給剛剛打開(kāi)的內(nèi)存空間,然后通過(guò)訪問(wèn)內(nèi)存中的地址值來(lái)間接訪問(wèn)地址下存儲(chǔ)的數(shù)據(jù)。如果地址值指向一個(gè)靜態(tài)存儲(chǔ)區(qū),比如一個(gè)字符串常量,當(dāng)然可以 不要修改指向的內(nèi)容。
C語(yǔ)言中的函數(shù)指針和指針函數(shù),有什么區(qū)別嗎?該如何理解?
謝謝邀請(qǐng)我。
C語(yǔ)言有數(shù)組指針和指針數(shù)組,現(xiàn)在有函數(shù)指針和指針函數(shù)。新手看到這里,可能會(huì)以為C語(yǔ)言是一種喜歡啃字的編程語(yǔ)言。其實(shí)我很討厭術(shù)語(yǔ),因?yàn)樗鼈兛偸亲尦鯇W(xué)者更難接受相關(guān)知識(shí)。
不過(guò)話說(shuō)回來(lái),如果你能理解并掌握C語(yǔ)言指針的基礎(chǔ)知識(shí),即使是第一次聽(tīng)到這些術(shù)語(yǔ),你也應(yīng)該能理解它們的含義,甚至你會(huì)很自然地這么稱呼它們。
函數(shù)指針字母 先復(fù)習(xí)數(shù)組指針和指針數(shù)組。題主可以看看我之前的回答或者文章,你應(yīng)該會(huì)發(fā)現(xiàn)只要 "數(shù)組和數(shù)組被視為與 "int ",數(shù)組指針和指針數(shù)組有明顯的區(qū)別。
int指針指向int數(shù)據(jù),array指針指向array指針。int數(shù)組是存儲(chǔ)int數(shù)據(jù)的數(shù)組,指針數(shù)組是存儲(chǔ)指針的數(shù)組。在C語(yǔ)言中,函數(shù)也是一種類型,函數(shù)指針是指向函數(shù)的指針。
如何定義函數(shù)指針?請(qǐng)看下面的例子:
通過(guò)分析定義函數(shù)指針的表達(dá)式void (* f )(char *)類似于通過(guò)分析定義數(shù)組指針。()優(yōu)先級(jí)高,所以f先和*結(jié)合,所以f先是指針。什么類型的?
* f外面是函數(shù)原型的格式,參數(shù)是char*,返回值是void,所以f是。指向函數(shù)類型的指針。hello函數(shù)恰好有一個(gè)char* type的參數(shù)和void類型的返回值,可以讓f指向hello。也可以寫(xiě)成:
Void (*f)(char *) hello可以通過(guò)函數(shù)指針調(diào)用它所指向的函數(shù),比如F( "吉姆和)上面,或者它可以以(* f)( "吉姆和).需要注意的是,F(xiàn)單獨(dú)寫(xiě)的時(shí)候是函數(shù)指針,沒(méi)有函數(shù)調(diào)用。要調(diào)用一個(gè)函數(shù),您需要添加 "() "符號(hào)。
你可以理解 "() "作為函數(shù)調(diào)用的操作符,它的左邊需要一個(gè)函數(shù)指針。
新手看到這里可能會(huì)有一些疑問(wèn),比如為什么初始化F的時(shí)候可以直接給F賦值hello或者amphello給F?再比如,為什么可以直接通過(guò)f調(diào)用函數(shù)( "吉姆和)或(* f)( "吉姆和)?其實(shí)做個(gè)實(shí)驗(yàn)就能明白。讓 讓我們打印出amphello,hello和* hello的地址。請(qǐng)看:
編譯執(zhí)行后,你會(huì)發(fā)現(xiàn)這三個(gè)C語(yǔ)言代碼實(shí)際上是等價(jià)的,所以程序雖然上面描述的使用方法略有不同,但也能正常工作。
但是在使用函數(shù)指針的時(shí)候,有些程序員更習(xí)慣下面的,這樣一看就知道是在使用函數(shù)指針。當(dāng)然,用哪個(gè)主要看個(gè)人習(xí)慣。
當(dāng)使用hello作為函數(shù)指針時(shí),使用amphello。f是指向一個(gè)函數(shù)的指針。通過(guò)f調(diào)用函數(shù)時(shí),使用(* f)(…)。現(xiàn)在知道怎么用函數(shù)指針了,但是函數(shù)指針的定義有點(diǎn)繁瑣。如果我想定義同類型的多個(gè)函數(shù),就要寫(xiě)很多重復(fù)的代碼。Isn t這 "不優(yōu)雅 "?事實(shí)上,應(yīng)該盡可能避免代碼重復(fù)。幸運(yùn)的是,C語(yǔ)言有typedef關(guān)鍵字。
Typedef關(guān)鍵字使我們能夠用其他符號(hào)替換復(fù)雜的數(shù)據(jù)類型。例如,在最后一個(gè)例子中,C語(yǔ)言代碼,我們使用uchar符號(hào)代替 "無(wú)符號(hào)字符類型。以后如果要定義無(wú)符號(hào)char類型的變量,可以直接使用uchar。在最后一個(gè)例子中,我們使用uchar定義了一個(gè)無(wú)符號(hào)字符類型的變量I。函數(shù)指針的定義也可以用typedef關(guān)鍵字簡(jiǎn)化:
我們使用有趣的符號(hào)代替函數(shù)指針類型。這個(gè)函數(shù)的參數(shù)類型是char*,返回值是void。以后遇到這種類型的函數(shù),可以直接用fun符號(hào)定義對(duì)應(yīng)的函數(shù)指針。
指針函數(shù)似乎是個(gè)陌生的詞,但相信題主對(duì)int函數(shù)很熟悉。是的,int函數(shù)是返回int數(shù)據(jù)的函數(shù),pointer函數(shù)是返回指針的函數(shù)。It 就這么簡(jiǎn)單。下面是一個(gè)使用指針函數(shù)的例子,請(qǐng)參見(jiàn)相關(guān)的C語(yǔ)言代碼:
get_str()函數(shù)的返回值是char指針類型,所以get_str是一個(gè)指針函數(shù)。它的調(diào)用和int等其他類型的函數(shù)一樣,指針函數(shù)真的沒(méi)什么特別的。
摘要指針函數(shù)是一個(gè)返回值為指針類型的函數(shù)。函數(shù)指針是一個(gè)指針,指向一個(gè)函數(shù)。通過(guò)函數(shù)指針,可以調(diào)用它所指向的函數(shù)。通過(guò)函數(shù)指針,我們可以使C語(yǔ)言模仿C語(yǔ)言來(lái)實(shí)現(xiàn) "階級(jí)和階級(jí)。題目可以參考我的相關(guān)文章。
歡迎在評(píng)論區(qū)一起討論提問(wèn)。這些文章都是手工原創(chuàng)的。每天都有最簡(jiǎn)單的C語(yǔ)言、linux等嵌入式開(kāi)發(fā)介紹。如果你喜歡我的文章,請(qǐng)關(guān)注一波。你可以看到最新的更新和以前的文章。