編程的本質(zhì)就是如何找到地址,取出數(shù)據(jù),把數(shù)據(jù)傳遞給CPU相應(yīng)的各種寄存器,經(jīng)過運算,然后把結(jié)果傳遞到相應(yīng)的存儲區(qū)域。所以C語言從編程的角度來說,變量可以分為兩類,一類是指針型(地址型)變量,另一類是普通變量(value值型變量) 好多人說,C語言的精華是指針,可是好多人就是不理解指針!看到一堆復(fù)雜的由*和小括號組成的指針就發(fā)暈,無法理解。這種問題產(chǎn)生的本質(zhì)原因是你對地址型變量的指針的基本概念理解的不茍透徹。本文將幫您解開這個困惑,幫您走入C語言學(xué)習(xí)的大門。 指針的基本概念大部分人都會告訴你指針就是地址,其實這種理解是有些片面的,不夠深刻。這也是大部分理解不夠透徹的根本原因。 我們的回答是: 指針本質(zhì)上是定義一種模型! 一個有效的指針變量一定會包含三個最重要的信息: 1、該指針?biāo)鶄鬟f的地址值,說白了就是一個整數(shù) int(32位平臺,就是一個4字節(jié)的2進(jìn)制整數(shù)),當(dāng)然對該地址進(jìn)行取*操作,就可以獲得該地址上的所存的數(shù)據(jù)的值。 2、該指針變量所代表的的類型。學(xué)究一點的說法是該指針類型所標(biāo)識的數(shù)據(jù)結(jié)構(gòu),這個結(jié)構(gòu)是在定義指針變量的時候確定的。說的更通俗一點,就是該型指針標(biāo)識的作用范圍。就是該地址的值為起始地址,往后多少個字節(jié)是屬于這個變量的數(shù)據(jù)。這一點尤其重要,經(jīng)常會被忽視而搞暈。 3、該指針的名稱。 我們先以最簡單的基本類型為例,予以說明 int* p1;char* p2; p1定義了一個可以存儲一個int 類型數(shù)據(jù)的指針變量,作用范圍就是-sizeof(int)的長度,名字為p1。 p2定義了一個可以存儲一個char類型數(shù)據(jù)的指針變量。作用范圍就是一個字節(jié)的長度-sizeof(char) 見下圖: 指針就像一個具有一定測量范圍的游標(biāo)卡尺 當(dāng)我們把地址A0(假設(shè)地址)傳遞給P1后,該變量就會把指針指向該地址,然后根據(jù)自己所能管轄的范圍,向后框住四個字節(jié),然后取值,就是10300610.而且每次都是要固定的框住四個字節(jié)(因為p1是int 類型的指針)。 同理,對于p2來說,每次只能框住1個字節(jié)。當(dāng)我們把地址A6傳遞給p2 時,得到的就是*p2=11 指針變量的運算int類型的數(shù)據(jù),占用4個字節(jié),本質(zhì)配意思是這四個字節(jié)當(dāng)做一個整體來看待,不能拆開。 當(dāng)p1 做+n(整數(shù))操作時,相當(dāng)于指針地址指向需要整體移動4*n個字節(jié)單位。p2由于是char*類型的,每加1,代表向后移動一個字節(jié),相應(yīng)地址也+1。 如下圖所示: 可見指針變量的加減操作就像是游標(biāo)卡尺在左右滑動。所框的范圍里面的值就是需要取得值。 |
|
來自: wenming044 > 《待分類》