在
c語言中指標可以說是其精華,常有一句話,學會了指標你也就學會了
c語言。但是很多人不能理解指標。我寫這篇文章的目的是幫助大家理解指標,內容都是跟人的見解,沒有指標基礎的、c語言高手和不喜歡的就別看了。
大家都認為,
c語言之所以強大,以及其自由性,很大部分體現在其靈活的指標運用上。因此,說指標是
c語言的靈魂,一點都不為過。同時,這種說法也讓很多人產生誤解,似乎只有
c語言的指標才能算指標。
basic
不支援指標,在此不論。其實,
pascal
語言本身也是支援指標的。從最初的
pascal
發展至今的
objectpascal
,可以說在指標運用上,絲毫不會遜色於
c語言的指標。
首先我們來看看null的定義:
#ifdef __cplusplus
#define null 0
#else
#define null ((void *)0)
#endif
null在c++中的定義就是0,在c中的定義是(void *)0,本質上還是0;指標的值說白了就是乙個數字,這個數字存在乙個變數中,這個變數就稱為指標。
那麼說隨便乙個數字都行嗎?肯定不是。這個數字是用來表示記憶體單元的,因此它必須是合法的記憶體位址,不管在什麼系統上它的值在ulong(unsigned long)範圍內,ulong在32位系統上是0-0xffffffff,在64位系統上就是0-0xffffffffffffffff;也就是說ulong根據執行環境改變。
以32位作業系統為例,在作業系統載入的時候要接管記憶體,那麼它怎麼管理呢?就是給每個記憶體單元編號,這個編號是乙個ulong型別的整數,所以它只能從0編號到0xffffffff,在普通pc上最小定址單元是byte(位元組),也就是最多可以編號0x100000000個位元組=4gb,這也就是為什麼大於4g記憶體的電腦都需要安裝64位作業系統的原因,32位作業系統最高支援4g記憶體,超出部分無法編號,作業系統也就不能管理,因此不能被使用。
注:以下以為32位系統
c語言中指標就是乙個編號,不管什麼型別的指標都是以個ulong型別的整數。那麼你不禁要問,為什麼我們在定義指標的時候還要指定型別?
舉個例子:
void increaseint(int *pi)
void increasechar(char *pc)
int main()
在函式increasint中我們使用了「*」運算子,*運算子就是我們從記憶體的位置取出值。假設變數a的位址是0x1000,傳到函式increasint中pi的值就是0x1000,我們使用「*」就可以從記憶體的0x1000處取往後4個位元組,加上256後放進0x1000-0x1003裡; 在函式
increaschar
中我們也使用了「*」運算子,假設b的位址是0xffc,傳到函式increaschar中pc的值就是0xffc,我們使用「*」就可以從記憶體的0xffc處取1個位元組,自增之後放進0xffc裡。
那麼編譯器怎麼知道「*」要取幾個位元組,這就是指標型別的作用了,指標型別就是告訴編譯器這個指標指向的目標占用的記憶體是多大,使用*和的時候才知道要取幾個位元組。
————————————————————————————割了————————————————————————————
最近專案太忙,把這個給忘了,七夕閒著沒事,給補上。
從上面的講述中大家應該可以明白,記憶體中儲存資料跟型別無關,它不考慮你是什麼型別,只有程式才去考慮型別;因為同樣一塊資料使用不同型別取出的值一樣,比如0xffffffff,使用unsigned int 取值是
4294967295,使用int取值是-1,使用unsigned char 取值是255(0xff),下面有個例子:
int main()
請問輸出的值是多少?
應該有相當一部分人認為會輸出0,
認為是10並且知道原因的請繞道,本文不適合你。不知道結果的繼續往下看,我先不說答案:
簡單劃一下函式的棧記憶體示意圖:
假設main函式基址為bp
引數空間(本例無參)
main函式基址 ----------------------------------------------- bp
a的位址即&a為bp-4
b[1]的位址bp-8
b[0]的位址bp-12
假設int* p = b;那麼&b[0] = p, &b[1] = p + 1,以此類推b[2] = p + 2 ,那麼位元組偏移就是:p = &b[0] = bp - 12,那麼p + 2就是bp - 4,即a;驚奇的發現b[2]就是a,所以本例輸出的結果是10。能把這題看透徹,指標應該學的不會太差。
就寫這些了,不寫不知道,一寫發現真難,舉例子很難舉。
關於C 指標
一.怎樣給多維陣列動態分配記憶體 allocate int p new int m for int i 0 i m i p i new int n use for int i 0 i m i for int j 0 j n j p i j i j free for int i 0 i m i del...
C 關於懸掛指標
如果乙個地方指標既不為空,也沒有被設定為指向乙個已知的物件,則這樣的指標稱為懸掛指標。在程式裡面是很危險的事 如下 include stdafx.h include iostream using namespace std typedef string t void f int p int main...
C 中關於this指標
在學習完c語言之後,很大的感覺就是指標是貫穿c語言的核心,但是接觸到c 後,發現很多都是封裝好的,直接用就可以。其中有一塊問題就是,通過函式去呼叫類的成員,上好像是直接訪問的,但是又有很多問題,為啥這個類裡面的函式可以直接訪問這個類裡面的成員呢?這就是我們需要關注的this指標。首先來看下面這段 c...