指針
指針是c語言中很靈活的一個內容,當然,靈活的都是較難掌握的。不過,只要理解其實質,學習,運用指針還是一件很輕松的事情的。
首先理解,1.什麼是指針?
在c語言中,指針也同Int ,double 一樣是一種數據類型,int 存放的是一個整型數字,double 存放的是一個雙精度的數字,指針存放的是地址。記得老師講過這樣一個形象的例子:指針類似於一間倉庫的門牌號。這個門牌號能體現這個房間的具體位置。
2.指針有什麼用?
因為指針存放的是地址,所以指針能直接訪問,傳遞那個地址上的數據和那個地址,這無疑對於我們下次即將說的 函數 有很大的方便。初步了解指針還是需要自己寫幾個小程序觀察一下,然後就知道了。
在寫程序之前,需要知道怎麼用指針。
因為指針也是一個數據類型,所以它的用法和 int的用法差不多都是一樣的。首先,1.定義指針 ,其格式為 數據類型(如 int ,double ,struct) + *標識符; 數據類型的意義是,你現在定義的這個指針所存放的地址是指向什麼數據類型的,例如 int *p; 它的意思就是定義一個指向整型數字的指針變量。
那麼,下面就寫寫小程序探索探索吧。
code:
#include<stdio.h> int main() { int a; //定義整型 scanf("%d",&a); while(a--) { int *p;//定義整型的指針變量 p=&a; //將a的地址賦給指針變量p //現在p存放的就是變量a所代表的數在計算機中所存放的地址了 printf("%d--",*p);//輸出p指向的地址存放的內容 printf("%d\n",p);//輸出p的地址 } }
運行結果:
從上面的代碼中可以很明確的看出,指正存放的是變量的地址。那麼思考一下,指針的地址又該是多少呢? 把上面程序的最後一個語句的前面加上一句 printf("%d--",&p); 運行之後可以看出是這樣的結果。
可見指針也是需要內存單元去存放的。
上面存在的還比較陌生的符號再說一下,* 有兩種用的地方1.在定義的時候用到,代表定義了一個指針變量,(如 int *p),2.在表達式中出現,代表取內容符號,取得p存放的地址裡面存放的內容,(如 *p) 。還有 & ,它被用作取地址符,取得內容所存放的地址,(如 &p)。
給兩個數,交換這兩個數,輸出這兩個數,相信每一位讀者都會獨立的寫出此程序,但是為了麻煩起見,能否通過對地址的操作來交換這兩個數呢?當然能。
code
#include<stdio.h> int main() { int a,b; int *p,*q,*w; //定義指針變量 scanf("%d%d",&a,&b); p=&a; //p存放變量a的地址 q=&b;//q存放變量b的地址 printf("1:%d %d\n",*p,*q); //地址的交換,與兩個數的交換方式一樣 w=p; p=q; q=w; //此時p存放變量b的地址,a存放變量b的地址 printf("2:%d %d\n",a,b); printf("3:%d %d\n",*p,*q); printf("4:%d %d\n",&a,&b); printf("5:%d %d\n",p,q); }
運行結果:
還需要提示的是,c語言中的很多東西都是可以鑲嵌重疊的,這我曾多次提到,而且指針也不例外 ,比如,你定義了這樣一個變量 int **q;這個變量有什麼用呢?它與int *p;有什麼關系? 前面那個q代表著定義了一個二級指針,它的作用是指向一級指針的地址,如 q=&p; 把一級指針p的地址賦給二級指針 q。同時三級,四級都是一樣的道理,只要記住指針保存的是地址,地址的內容與它所對應的數據類型有關。
指針被稱為c語言中最難應用的部分,不過只要掌握原理,仔細想想,一些基礎的問題還是能很容易想明白的。