指針是以一種靈活的方式來表示變量或者說數據。他只是一個很基礎的東西,我們初學它的時候都會覺得很難很抽象,然而後面的大多數地方都會用到指針,然後會有一種看見指針望而卻步的感覺,這是我自己的切身感受,但是其實指針並不是C語言的難點,需要的只是多寫些代碼就會了。
地址
前面說內存的時候也給大家有意無意的提到了這點,我們的變量全部都是在內存中,而內存是一個有很多房間的酒店,每個房間有不同的房間號,這個房間號就是地址。內存被一塊一塊的分成了很多,當我們的變量存儲在內存中時,就有一個地址“編號”。(這個比喻其實並不是很恰當,但是我們可以先這樣理解)並且這個編號是獨一無二的。
所以我們的每個變量都會有一個地址,而我們今天說的指針就是利用地址來訪問變量的一種變量(指針變量)。
指針的形式簡單,就是在我們前面講的變量聲明的時候加上*(星號)。
int *a;//指向整型變量a的指針
float *b;//指向單精度浮點數變量b的指針
char *c;//指向字符變量c的指針
我們怎麼初始化一個指針呢?
int *a;
int b=5;
a=&b;
我們前面講了&取地址這個符號,目的是取b這個變量的地址賦值給a。然後*a便是指向5這個變量。所以這裏要明白a是地址,*a是指針變量(是一個具體的變量值)。
上圖表現了上述的關係。
其實指針的基本語法也就這樣。大家肯定還是覺得簡單,但是看看下面這個呢?
int a;
*&a=25;
上面這段代碼的意思是什麼呢?如果你能明白的話,你就已經明白指針了。他是將25賦值給a,但是在真正的編程的時候誰都不會這樣做,這裏只是讓你更加明白指針。
注意事項:
指針變量初始化時,只能通過賦值地址,不能將值賦值給它。
int *a=12;
上面這種做法是錯誤的。因爲指針變量a並不知道12這個地址是什麼,能不能訪問(但是c語言語法是允許這樣做的,但是千萬不要這樣做)。
int a;
int *b=&a;
上面的代碼就是對的。
指針的指針
首先我們必須要知道指針變量,它也是一個變量,所以也會有一個地址來存儲它,也就是說指針變量也有地址。
那麼指針的指針就是指向指針變量地址的指針。
int **c;
聲明方式如上。我們再來看看初始化:
int *a;
int b=5;
int **c;
a=&b;
c=&a;
上圖表現了指針的指針。
這裏先介紹一些基本的東西,首先會用,然後我們再慢慢深入。後面在具體的編程環境裏面再慢慢體會。
既然有指針的指針,那當然也有指針的指針的指針。定義也是類似的,只是我們很少去用了,也根本不太會用上。
指針的運算
指針變量是變量,只要是變量就可以進行加減,以及前面所說的所有操作符。
我們把指針變量,當做普通的變量來進行操作。
int *a;
……
a+=1;
a-=1;
a++;
a--;
通過上圖我們可以看看指針的運算,右邊是假設的地址,通過加減運算指針可以任意訪問上面的地址。
當然這個是有點抽象,後面我們講數組和指針的關係的時候慢慢討論這個。
總結
指針是通過地址訪問變量的一種變量。地址的操作更加接近底層,後面我們也會體會到指針的靈活性,本篇主要講述指針的一些基礎東西。