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