1. 程式人生 > >C語言指標學多了,為什麼你會暈乎乎的?

C語言指標學多了,為什麼你會暈乎乎的?

對於C語言中的指標概念,如果我告訴你,它是一個地址變數,你聽了一頭霧水,“地址?啥意思?”見你不理解,我說的詳細點“指標變數跟其他變數一樣,儲存的是一個地址”。你想了想,“跟其他變數一樣?其他變數存放的是數值,變數有地址....指標變數存放的是地址,地址裡有個值.....”你又暈掉了!沒辦法,我找了專業教材,找到教材上對指標的定義“指標是一個變數,儲存的另一個變數的地址,也就是另一個變數所在的記憶體位置的首地址。”你轉了轉大眼睛,仍然一頭懵逼!
好吧,看來傳統的解釋會讓你一直暈下去,那我不解釋了,本篇文章我不解釋什麼叫指標了,我就重點說下為什麼指標會讓你暈,指出讓你暈的根本原因,也許你知道了就不暈了呢?

我們先來看一個很簡單的變數定義:
int a = 1;
a是一個整型變數,它的值是1,對於這麼簡單的一個變數,你鐵定地絕對地一定地不會暈,a就是1,1就是a嘛,簡單、清晰、明瞭!
畫個圖來看下:


好了,下面我們再定義一個指標變數p:
  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. int main()  
  4. {  
  5.     int *p = NULL;  
  6.     p = (int *) malloc (sizeof(int)); //為指標變數p申請一段記憶體地址
  7.     printf("指標p的值是%x\n", p);  
  8.     *p = 2;//上述申請的記憶體地址存放的數值是2
  9.     printf("指標p指向的值是%d\n", *p);  
  10.     free(p);  
  11.     p = NULL;  
  12.     return 0;  
  13. }    


我們先看下執行結果:

p的值是“380fe0”,指向的值是2。你看到這個後,你會想“剛才變數a和1好理解,a就是1,1就是a。現在有p,380fe0,2三個東東,p就是380fe0?那p跟2是啥關係?380fe0跟2又是啥關係?對了,好像還有個*p這個東東,又是什麼關係?完了,我暈了!!”現在我可以指出,在理論上,你指標學多了暈的根本原因就在如下兩點:

1.有四個東西:p,*p,380fe0和2,比剛才的a和1硬生生多了兩個東西,使得你大腦思考時多了兩個需要思考的物件,增加了你大腦思考的負擔;

2.這四個東西:p,*p,380fe0和2中,只有p、*p、2會被程式程式碼所使用,380fe0一般用不到,但是你又必須時時刻刻記著這個380fe0,又再次增加你大腦思考的負擔;
好了,我再用一張圖來形象地解釋你會暈的原因:


與a和1的那張圖對比,形象上來說你指標學多了暈的根本原因又在如下3點:
1.你傳統思維是a就是1,1就是a。但在指標變數來看,p就不是2,2也不是p了。p是啥?p就是380fe0,380fe0就是p。注意,你的傳統思維開始第一次被顛覆,接著看:
2.那誰就是2,2就是誰呢?答案就在於*p就是2,2就是*p。出現了*p,你的傳統思維第二次被顛覆,哈哈;
3.那p和*p啥關係?兩者長的好像啊,就是多了一個*的區別。你的傳統思維開始第三次被顛覆。到這裡,你基本上已經暈了;


那麼,在學指標,用指標時,如何做到不暈呢?除了好好多學習多思考外,我教你三招:
1.看到指標變數時,立即拋棄你的a就是1,1就是a的傳統思維,開始想到p,*p,380fe0和2這四個東東,不然你會思考的很痛苦;
2.牢記p與380fe0是一家,*p與2是一家;
3.記住p與2是遠方親戚,p與2要通過*p來聯絡;*p與380fe0是遠方親戚,*p脫掉*就和380fe0是一家了。


這篇文章主要是分析指標學習讓你頭暈的原因,文字表述可能並不嚴謹,請見諒!