C語言對內(nèi)存地址的操作

相信大家學(xué)習(xí)C語言之初都會接觸到數(shù)組,也會接觸到scanf函數(shù)中的&取地址符號,那么可能會有疑惑為什么scanf對數(shù)組變量不需要添加取地址符號呢。

其實數(shù)組名就是一個指針,指針是C語言特有的,指針指向了該變量在內(nèi)存中的地址,而數(shù)組名就是該數(shù)組在內(nèi)存中的首地址。



C語言進階學(xué)習(xí)中大家都會接觸到鏈表。

要學(xué)習(xí)鏈表首先要熟練掌握C語言中對地址的操作,C語言區(qū)別于其他語言的最大特征就是它允許程序員直接訪問計算機內(nèi)存地址。程序員通過指針訪問內(nèi)存地址。

例如一個int型指針的定義及初始化:int*p = NULL;

C語言最強大的地方莫過于此而最危險的地方也在此,對內(nèi)存的操作不慎很可能讓程序崩潰而在查BUG的時候往往不知道出錯的位置。為此,我個人習(xí)慣將所有的指針變量自定義時即初始化,即使是初始化為NULL。

熟悉指針之后,接下來要了解的是開辟內(nèi)存空間。



內(nèi)存中分為代碼區(qū)、靜態(tài)/全局區(qū)、棧和堆幾部分。

在某個函數(shù)中的簡單聲明,如 int a = 0。這個變量就是存放于內(nèi)存的棧中。

若是全局變量或者添加了static關(guān)鍵字的變量聲明,則會存放于靜態(tài)/全局區(qū)。

而C語言中的malloc等函數(shù),C++中的new關(guān)鍵字 能夠開辟動態(tài)的內(nèi)存空間,這種方式申請的內(nèi)存空間存放于堆中。

棧中內(nèi)存從大到小的遞減方向進行使用,堆則是從小到大的遞增方向——這影響了變量在生命周期結(jié)束時內(nèi)存釋放的順序(不明白不用糾結(jié),至少我目前沒運用到這部分知識)



C語言中通常使用malloc()函數(shù)開辟空間,如:

#include <stdio.h>

#include <stdlib.h>????????????????????????????????????????//stdlib.h包含了我們需要的malloc()函數(shù)

#define MAX 999? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //宏定義MAX為999

int main()

{

????int *p = (int*)malloc(sizeof(int)*MAX);? ? ? ? //聲明int類型指針p,并調(diào)用malloc()函數(shù),利用(int*)進行類型轉(zhuǎn)換

????return 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//malloc()的參數(shù)填入你需要開辟內(nèi)存空間的字節(jié)數(shù)

}

其中的MAX可以換成變量,這樣的話,p指針指向了一塊int類型的內(nèi)存而且大小隨變量變化。

相當(dāng)于創(chuàng)建了一個動態(tài)容量的數(shù)組。


指針除了能夠開辟動態(tài)內(nèi)存、數(shù)組,還有更多更復(fù)雜的用法,例如二維數(shù)組、函數(shù)指針、指針數(shù)組、鏈表、函數(shù)指針作為另一函數(shù)參數(shù)等。有空再更啦,內(nèi)容好多的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容