相信大家學(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)容好多的。