C語言指針的一些用法


指針是C語言的靈魂,精華之所在。指針強大而危險,用得好是一大利器,用得不好是一大
潛在危害。正是指針具有強大而又危險的特性,加上指針比較難,很多人用的不好,所以越是封裝
程度高的語言,越是沒有指針的"存在"。比如JAVA,Python,就是把指針隱藏去了,不讓用戶接觸,但很多功能
實質上還是用到指針的,只不過是封裝好了,對用戶隱藏。

如果指針學得好,在編程時可謂如虎添翼,用起招式也會遊刃有餘。

很多人覺得指針很難,其實不然,只要理解了指針的實質,多見,多練,也就是1+1=2的事。


指針的實質也很簡單:在C語言中,指針是一種數據類型,用來存放各種類型的地址,通過地址可以找到該地址
單元的值,故稱指針。簡單而言,指針就是存放地址的。

 

指針強大的原因:程序要運行就必須加載到內存中去,因此程序的要運行的指令和所要
用到的數據都可以通過內存地址也就是指針獲取到,有了指針你就可以掌控程序運行的流程和所用到的數據
然後可以爲所欲爲了,當然指針所能訪問的一般而言都是合法的地址,至於如何訪問不合法的地址,那就是另外的話題。

現在來看看指針的一些用法。
在C語言中,任何類型的指針的大小是4個字節,因爲存放的都是地址。
1.
  int *p;//定義了一個整型指針,可以存放整型數據的地址
  int a=3;
  p=&a;(p就了存放a的地址,也就是說p指向了a,*p就等於3)

2.

  char*p="abcdef";//字符指針,p存放的是第一個字符(a)的地址,*p==a;

3.
  int a1[10];//整型數組,a1是一個數組,存放整型(int)數據
  int *p1=a1;//數組指針,p1是一個指針,存放整型數據的地址

  int *a2[10];//指針數組,a2是一個數組,存放的是整型指針(int*)數據

  int (*p2)[10];//數組指針,p2是一個指針,存放的是存放10個整型數據的數組的地址

4.
  void fun(int,int)
  {

  }

  void(*p1)(int,int);//函數指針,p1是一個指針,存放的是一個返回值爲void,參數爲兩個int的函數的地址
  p1=fun;//函數名即爲函數的地址.
  p1();

  常見用法:typedef void(*pointer)(int,int);//pointer爲自定義的類型,這種類型表示可以定義返回值爲void,參數爲兩個int型的函數的指針


  pointer p2;//p2是一個函數指針
  p2=fun;
  p2();

5.
  void(*a[10])(int);//指針函數,a是一個數組,因爲'[' 的優先級比'*'大,a先和‘[’結合,存放的數據是返回值爲void,參數爲一個int的函數指針,

6.
  void(*(*p)[10])();//數組指針,p是一個指針,指向(存放10個返回值爲void,沒有參數的函數指針數據的)數組的地址

7.
  二級指針:表示指針存放的數據本身又是一個指針。

  char **p;//二級指針

  char*str[2]={"abc","defg"];//字符串數組

  p=str;//p是一個二級指針存放數組的地址,*p也是一個指針,存放的是第一個字符串的首字符的地址,**p就是字符'h'


8.

  指針可以進行加減運算

  int a[10];
  假設
  a[0]的地址:  1000(十進制)
  a[1]的地址:  1004//因爲int在C語言中佔4個字節
  a[2]的地址:  1008

  int*p=a;  //p存放的就是a[0]的地址1000,因爲數組名就是數組第一個元素的地址

  p++;  //此時p不是加1變成1001,此時p應該爲1004,指針的加減是按數據類型所佔的字節數進行加減的
           //因爲int佔4個字節,所以p++爲1004指向下一個元素。也就是a[1]


9.

  指針還有很多用法,有些起來很複雜,但是本質都一樣,至於如何把指針的強大之處用起來,就要靠各位
  在寫程序時按需發揮了。

  還是那句話,想熟悉一樣東西,要多見,多練,多想。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章