關於指針,我對初學C語言的同窗們真的有話要說!

這些日子其實也不是閒着的,覺得自己算法方面差的很多,所以一個勁的看“嚴書”。不過真的是有爬雪山、過草地的感覺,萬里長征還剛剛開始,我已經快到40歲了,也就是黃土都埋到一半的人了,不由得也要感嘆一下了!又覺得操作系統還只是開了頭,具體的理論知識,真的不懂多少,所以又要拿起那本“minx操作系統與實現”書來啃一下,至於是什麼效果了,自己就沒有辦法了,看了後邊忘前邊,回過來翻前面的吧,後面的又不知看過沒有了,總之是二師兄照鏡子裏外不是個東西了。好在了學也是沒有白學了,終究是對C語言中的某些東西有了一點點感覺,因此上也在這裏顯擺顯擺吧!

毋庸置疑,C語言中挺重要的東西就是那個叫做指針的東西,很多大部頭的C書也是把指針作爲一個重點和難點的問題來長篇累牘的說個不停,一些新入門的同窗們更是被指針弄得焦頭亂額。這也就是凡是在網上學習C的都不禁要在這個博客那個論壇上,多問上幾句C指針問題的原因吧,而且回答的人也真的很多,看來弄懂了這個以後,他們也都像我一樣急於發泄一下鬱積在對此問題的不滿,特別想讓新同窗快懂和少走彎路,可是呢事與願違,偏偏這個問題卻又是心急吃不了熱豆腐的事,似乎沒有幾個人能用幾天就大徹大悟,反正我是這麼認爲的。

好了閒話少言,還是說點淡的吧。

那麼這個指針又是個什麼東西呢?定義我這裏就不班門弄斧了,書上比我說的好多了。我這裏倒是有一個問題,就是指針就是地址嗎?

是啊,指針跟地址究竟有什麼關係呢? 那麼我們要首先從地址開始說起了,但是地址這個東西如果要是說的話,是要從彙編語言的角度來說的,也就是講微機原理 或 彙編語言的書一定會講到地址這個話題。沒有辦法我們也不得不說了。

第一個問題物理地址,那32位的intel機器來說,2的32次方是4G,那麼物理地址就是0----4G-1(因爲從0開始,最大直到4G-1)了,因此我們如果能夠直接操作物理地址的話,我們也就是在0----4G的範圍內來訪問地址了,那麼有一個問題就是哪裏是0地址,哪裏又是4G地址呢,這個就很簡單了,我們編號就好了,從0地址開始編號一直編到4G,這個不就跟沒有說是一樣的嗎,想當然這樣說的人,就會是想當然的,看似明白實際上對一個順序的問題,是不是會有些糊塗呀。之所以這樣問,就是因爲,0後面是1,1後面2,2後面纔是3,依次類推。形成了物理地址一個順序上的編制序列,倘若1後面編號爲8,這個可就沒有規律可循了,也會出現意向不到的問題。同時也說明一個問題,物理地址沒有負數。

第二個問題邏輯地址,邏輯地址就不一樣了,假設我們把物理地址4G - 1作爲邏輯地址開頭0處,那麼後面沒有可用地址了,因此上前面的都是負地址,同樣,若從某處開始的話,就在某處是0,而前面的是負地址,後面的是正地址,這時候我們要向訪問前面的地址就的做減法,後面的就做加法。

第三個問題虛擬地址,而偏偏操作系統又必須通過某種地址轉換的方式爲我們的應用程序提供虛擬地址,它也是從0開始,沒有負數,具體系統的怎麼轉換的那可說不好了,光Intel就有段管理和頁管理等模式。不過它給應用程序提供了方便,就是我們不用管是怎麼轉換的,只要使用就行了,當然前提是操作系統分配了這個地址。

說完了這些似乎是明白了一些,糊塗了一大堆吧,這也就難怪了,如果是真的弄懂指針,還是要理解一下地址了。

可是我們連一句彙編語言也沒有說呀,是不跑題了,當然 不是,在彙編語言中一個重點和難點就是叫做尋址方式的東西,恰好和我們指針的問題對應上,什麼立即尋址,直接尋址,寄存器尋址,基址尋址,變址尋址,帶比例因子的尋址都是這個範疇的問題,但是C語言的指針內部與這些是怎麼對應上的,我們就只有研讀編譯原理中的問題了,我們沒有能力學習那許多的東西也就是泛泛而言了。

還有一個令你意向不到的大問題一定會出現,就是每個物理地址和虛擬地址的有多大,也就是虛擬地址的單位是什麼,對了1字節,注意是1字節,這個到了指針中,就是大大的問題。

說道現在其實可以回答一個關鍵的問題了,指針到底是不是地址,我想你也一定知道了吧。

當數據的類型是char時,指針和地址確實是等價的,一一對應的,但如果是int或其他類型呢,因爲每種類型都描述爲不同的長度,所以有些地址,在int型中永遠也不可能被訪問到,它僅僅是4的倍數的地址。

說這個的目的是,指針和地址真的不可分,但是不同的是指針的增減,不是地址簡單的加一或減一的操作,而是要乘以一個比例因子。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章