數組與指針
指針也是一種變量,表明着指向一個地址數組
指針變量裏面存的值是一個數字,數字是幾就表明指向內存的哪裏函數
指針的賦值
通常狀況下指針會用一個有意義的地址來賦值(&表明取地址)spa
int a[10]; int v; int *pa=a; int *pv=&v;
上面的數組a能夠賦值給pa是由於數組名字就表明了數組的首地址指針
解引用
解引用就是表明得到這個地址指向那塊內存的值,這個值如何解釋由這個指針的類型決定code
舉個例子:blog
int ans=4; int *pans=&ans; *pans=5; printf("%d\n",ans);
因爲pans指向的是ans的地址,咱們對*pans賦值操做,ans也會被改變內存
再來一個例子:it
咱們知道一個 int 的佔用空間是32bit 一個char佔用空間的大小8bitclass
char a[4]={1,2,3,4}; int *p=a; printf("*p:0x%x\n",*p);
%x表明16進制輸出的,能夠看到咱們定義的char數組按照 int類型解釋了變量
咱們對*p操做也將會影響到char數組
還有一種解引用就是結構體指針可使用->
操做
簡單的應用
函數傳參:
咱們在函數傳參數的時候,若是咱們想在函數體內改變一個外部變量,一般狀況下須要傳遞這個指針
在傳遞數組的時候,咱們一般是傳遞這個數組的首地址,而不是這個數組的拷貝
咱們在遍歷數組的時候可使用指針,更高效的操做
int a[10]; int *pa=a; int *ped=pa+10; while(pa<=ped) { //do something pa++; }
還有一點須要注意的就是,指針作加減運算的時候每次偏移量是sizeof(type)
數組和指針的區別
數組名字表明首地址,咱們在使用數組的元素的時候a[i],至關於*(a+i)
咱們在使用數組的時候甚至能夠這樣:
int a[10]; 4[a]=5;//等效a[4]=5;
不過最好不要這樣作,容易引發別人的困惑
可是數組名是不能夠被賦值,不能使用自增自減操做
咱們對數組進行sizeof操做時候,獲得的是數組的實際大小,對指針操做時,只能獲得指針長度大小
int a[10]; sizeof(a); int *pa=a; sizeof(pa);