1.語言中變量的實質編程
要理解C指針,我認爲必定要理解C中「變量」的存儲實質, 因此我就從「變量」這個東西開始講起吧!學習
先來理解理解內存空間吧!請看下圖:指針
內存地址→ 6 7 8 9 10 11 12 13內存
-----------------------------------------------------------------變量
。。。 | | | | | | | |.。總結
------------------------------- ----------------------------------命名
如圖所示,內存只不過是一個存放數據的空間,就好像我 的看電影時的電影院中的座位同樣。每一個座位都要編號,咱們的內存要存放各類各樣的數據,固然咱們 要知道咱們的這些數據存放在什麼位置吧!因此內存也要象座位同樣進行編號了,這就是咱們所說的內 存編址。座位能夠是按一個座位一個號碼的從一號開始編號,內存則是按一個字節一個字節進行編址, 如上圖所示。每一個字節都有個編號,咱們稱之爲內存地址。好了,我說了這麼多,如今你能理解內存空 間這個概念嗎?數據
咱們繼續看看如下的C、C++語言變量申明:語言
int I;生活
char a;
每次咱們要使用某變量時都要事先這樣申明它,它實際上是內存中申請了一個名爲i的整型變量寬 度的空間(DOS下的16位編程中其寬度爲二個字節),和一個名爲a的字符型變量寬度的空間(佔一個字 節)。
咱們又如何來理解變量是如何存在的呢。當咱們以下申明變量時:
int I;
char a;
內存中的映象可能以下圖:
內存地址→ 6 7 8 9 10 11 12 13
----------------------- -------------------------------------------
。。。| | | | | | | |.。
------------------------------------------------------------------
變量名|→ i ←|→ a ←|
圖中可看出,i在內存起始地址爲6上申請了 兩個字節的空間(我這裏假設了int的寬度爲16位,不一樣系統中int的寬度是可能不同的),並命名爲 i. a在內存地址爲8上申請了一字節的空間,並命名爲a.這樣咱們就有兩個不一樣類型的變量了。
2.賦值給變量
再看下面賦值:
i=30
a=‘t’
你固然知 道個兩個語句是將30存入i變量的內存空間中,將‘t’字符存入a變量的內存空間中。咱們可 以這樣的形象理解啦:
內存地址→ 6 7 8 9 10 11 12 13
------------------------------------------------ -----------------------
。。。 | 30 | ‘t’ | | | | |.。
-------------------------------------------------------------------- ---
|→ i ←|→ a ←|
3.變量在哪裏?(即我想知道變量的地 址)
好了,接下來咱們來看看&i是什麼意思?
是取i變量所在的地址編號嘛!咱們可 以這樣讀它:返回i變量的地址編號。你記住了嗎?
我要在屏幕上顯示變量的地址值的話,能夠 寫以下代碼:
printf(「%d」,&i);
以上圖的內存映象所例,屏幕上 顯示的不是i值30,而是顯示i的內存地址編號6了。固然實際你操做的時,i變量的地址值不會是這個數 了。
這就是我認爲做爲初學者們所應想象的變量存儲實質了。請這樣理解吧!
最後總結代碼以下:
int main()
{
int i=39;
printf(「%d\n」,i); //①
printf(「%d\n」, &i); //②
}
如今你可知道 ①、②兩個printf分別在屏幕上輸出的是i的什麼東西啊?
好啦!下面咱們就開始真正進入指針 的學習了。
2、指針是什麼東西
想說弄懂你不容易啊!咱們許多初學指針的人都要這樣的感慨。我經常在思索它,爲何呢?其實生活中到處都有指針。咱們也到處在使用它。有了它咱們的生活才更加方便 了。沒有指針,那生活纔不方便。不信?你看下面的例子。
這是一個生活中的例子:好比說你要 我借給你一本書,我到了你宿舍,可是你人不在宿舍,因而我把書放在你的2層3號的書架上,並寫了一 張紙條放在你的桌上。紙條上寫着:你要的書在第2層3號的書架上。當你回來時,看到這張紙條。你就 知道了我借與你的書放在哪了。你想一想看,這張紙條的做用,紙條自己不是書,它上面也沒有放着書。 那麼你又如何知道書的位置呢?由於紙條上寫着書的位置嘛!其實這張紙條就是一個指針了。它上面的 內容不是書自己,而是書的地址,你經過紙條這個指針找到了我借給你的本書。
那麼咱們C,C++ 中的指針又是什麼呢?請繼續跟我來吧,看下面看一個申明一整型指針變量的語句以下:
int * pi;
pi是一個指針,固然咱們知道啦,可是這樣說,你就覺得pi必定是個多麼特別的東西了。其 實,它也只過是一個變量而已。與上一篇中說的變量並無實質的區別。不信你看下面圖。
內存 地址→6 7 8 9 10 11 12 13 14
--------------------------------------------------------------
...| 30 | ‘t’ | | | | | | |……
--------------------------------------------------- -----------
|→ i ←|→ a ←| |→ pi ←|
(說明:這裏我假設了指針只佔2個字節寬度,實際上在32位系統中,指針的寬度 是4個字節寬的,即32位。)由圖示中能夠看出,咱們使用int *Pi申明指針變量; 實際上是在內存的某處 申明一個必定寬度的內存空間,並把它命名爲Pi.你能在圖中看出pi與前面的i,a 變量有什麼本質區別 嗎,沒有,固然沒有!pi也只不過是一個變量而已嘛!那麼它又爲何會被稱爲指針?關鍵是咱們要讓 這個變量所存儲的內容是什麼。如今我要讓pi成爲真正有意義上的指針。請接着看下面語句:
pi=&i;
你應該知道 &i是什麼意思吧!再次提醒你啦:這是返回i變量的地址編 號。整句的意思就是把i地址的編號賦值給pi,也就是你在pi上寫上i的地址編號。結果以下圖所示:
內存地址→6 7 8 9 10 11 12 13 14
------------------------------------------------------------------
...| 30 | ’t’ | | | 6 | | |……
----------------------------------------------- -------------------
|→ i ←|→ a ←| |→ pi ←|
你看,執行完pi=&i;後,在圖示中的系統中,pi的值是6.這 個6就是i變量的地址編號,這樣pi就指向了變量i了。你看,pi與那張紙條有什麼區別?pi不就是那張紙 條嘛!上面寫着i的地址,而i就是那個本書。你如今看懂了嗎?所以,咱們就把pi稱爲指針。因此你要 記住,指針變量所存的內容就是內存的地址編號!好了,如今咱們就能夠經過這個指針pi來訪問到i這個 變量了,不是嗎?。看下面語句:
printf(「%d」,*pi);
那麼*pi什麼意 思呢?你只要這樣讀它:pi內容所指的地址的內容(嘻嘻,看上去好像在繞口令了),就pi這張「 紙條」上所寫的位置上的那本 「書」——i .你看,Pi內容是6,也就是說 pi指向內存編號爲6的地址。*pi嘛!就是它所指地址的內容,即地址編號6上的內容了。固然就是30的值 了。因此這條語句會在屏幕上顯示30.也就是說printf(「%d」,*pi);語句等價於printf ( 「%d」, i ) ,請結合上圖好好體會吧