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