我們先來分析一下暈車的原理,再來對比一下為什麼暈指針。
暈車,是因為耳朵裡的一個器官對外界的振動太敏感,導致身體調節功能紊亂,系統不能正常工作,輕則,暈點,中則,吐點,重則,“重啟”(倒地)。時間長了,知道自己暈車,於是,看到公交車,TAXI,火車,自行車,都暈!這樣的病就大了,上升到心理疾病了。這可得治。我們都明白上面的道理,怎麼克服暈車呢?你不可能避免做車,你要去面對,怎麼克服暈車也很簡單,先是功心,“口服不如心服”,所以先治心病:建立信心。經常試著去做晃動不大的車,最好聽著MP3,這樣能減緩心理對暈車的敏感度。時間長了,慢慢的克服了心理作用,然後就要上升到治根的階段了,要去試著挑戰做公交,TAXI,船。
上面都是個人的一些見解,上大學時,要是不學計算機就去學醫了!
回來我們開始治“暈指針”這號病,其實很多同學暈指針,也是因為自己基礎不好(身體素質不好),剛開始學的時候,不用心,還沒有弄的很明白,一編程(有的同學4年都沒編過一個程序)就錯,形成了恐懼心理,其實C指針非常靈活,它對學生的要求也比較高,說白了,它要求有計算機的組成原理一些基礎,如果有的話,你回頭看指針,So easy!
我們先開始“攻心”。
1. 暈指針,唐式偏方一:“投石問路”
#include <stdio.h>
int main(void)
{
char* str = "ABCDEFGHIJKL";
int* pInt = (int*)str;
printf("%c\n%c\n",*(str+1),*(char *)(pInt+1));
return 0;
}
上面的程序如果你要是灰常EASY的回答出來,那你的功底已經不錯了!心病是估計沒有了,可以進入吃藥保養階段了(做題)。
如果上面的題看起來就特別費勁,看來你暈的不輕,得治。要不問題會很嚴重。
基於上面的小測試,進入唐式第二方:“理氣靜心”
我們先看把C指針的基礎打好。在這之前先來復習下變量和常量,有的同學會問,這是為什麼,我只能告訴你,你暈C指針,是因為你從剛開始有問題就沒有重視,或者你忽略了問題的嚴重性,導致現在的情況,這也沒有辦法,中國的教育就不重視這一塊,說實話,大學裡講C語言的,很多都沒有太多的講到變量和常量,這是很XXX的。我們開始治療。
常量又分為:直接常量和符號常量。
直接常量又叫做:字面常量。如12,0,4.6,‘a‘,“abcd”
符號常量如宏定義的:#define PI 3.14
特點:常量的值在其作用域內不會發生改變,也不能再被賦值。其在出現時就被當作一個立即數來使用。也就是說,只能被訪問,被讀,而不能被寫,被賦值。
變量名是在,變量的聲明的時候,該名字就和內存中一塊地址綁定在一起了。可以通過變量名直接找到對應的內存區域,也可以通過地址找到其內存區域。因此有了引入指針的依據。
變量的值是變量所對應的內存區域內存放的二進制序列。當該變量被聲明成整形時,內存區域的二進制序列被以整形的形式翻譯出來。比如:int a = 97; 其在內存中是以97的二進制形式存放的,當使用時,他會被以10進制形式表現出來。同樣的char a = ‘a’; a的ASIIC碼是97,也是以97的二進制存放的,使用時,會被以字符a的形式表現出來。
如果變量是一個指針變量,那麼指針變量裡的二進制序列被翻譯成一個地址,
比如:
int a = 10;
int * p;
p = &a;
這裡的指針變量p的值是a的地址(p = &a),它是什麼啊?看下圖:
聲明了一個變量a,它是整型,被賦值為10(它的值被翻譯成整數),要形成這種思維,時間長了你就知道這樣做的好處了,又聲明了一個指針變量p,它是Int類型的(它指向的地址裡面要裝Int),然後將a變量的地址(ox2c406b24)給了p,這兒注意下。現在訪問a裡面的值有了兩種方式(其實本來也有這兩種),一個是通過變量名a(綁定的),一個是通過地址ox2c406b24,地址ox2c406b24給了p了,p指針變量(指針變量是變量,這個思維很重要)裡面存放的是ox2c406b24(a的地址),那麼現在訪問a可以通過:
printf("%d\n", a); //通過變量名
printf("%d\n", *p); //通過指針變量