20145320《資訊保安系統設計基礎》第十二週學習總結

20145320周岐浩發表於2016-12-04

20145320《資訊保安系統設計基礎》第十二週學習總結

學習內容總結回顧


第九周學習內容總結

第十週學習內容總結

第十一週學習內容總結

指標與宣告

  • C語言中變數的宣告包括兩個部分:
    - 型別
    - 宣告符
    • 對於簡單型別,宣告並不會對程式碼產生多大的閱讀障礙,而對於複雜型別的識別,可以採用右左右左法進行判斷。

指標陣列與陣列指標

  • 指標陣列:即用於儲存指標的陣列,也就是陣列元素都是指標
    • 舉例說明:
      • int *a[10]
      • 表示:陣列a中的元素都為int型指標
      • 元素表示:a[i] (a[i])也是一樣的,因為[]優先順序高於*
  • 陣列指標:即指向陣列的指標,指標指向一個型別和元素個數都固定的陣列
    • 舉例說明:
      • int (*a)[10]
      • 表示:指向陣列a的指標
      • 元素表示:(*a)[i]
  • 指標函式:即返回值是指標型別的函式
    • 舉例說明:
      • int *comp()
  • 函式指標:即指向函式的指標,函式名就是函式指標
    • 舉例說明:
      • int (*comp1)()

右左右左法

  • 具體方法:
  • 從變數名開始,先右再左地,交替地一個一個向外看,在紙上寫下:“變數是”
  • 若向右遇到左圓括號,在紙上寫下:“函式,引數是”,並用同樣的方法處理括號中每一個引數——在紙上寫下:“返回”
  • 若向右遇到方括號,在紙上寫下:“陣列,長度為{方括號的內容},元素型別為”
  • 若向右遇到右圓括號,什麼也不做
  • 若向左遇到*,在紙上寫下:“指標,指向”
  • 若向左遇到任何型別,在紙上寫下對應的型別名
  • 舉例說明:分析void ((*fp1)(int))[10]
  • 從fp1開始——fp1是
  • 向右,遇到右括號,什麼也不做
  • 向左,遇到*——指標,指向
  • 向右,遇到左圓括號——函式,引數是int,返回
  • 向左,遇到*——指標,指向
  • 向右,遇到左方括號——陣列,長度為10,元素型別為
  • 向左,遇到*——指標,指向
  • 向右,已經到宣告結尾,什麼也不做
  • 向左,遇到void——void
  • 結果是:fp1是 指標,指向 函式,引數是int,返回指標,指向陣列,長度為10,元素型別為 指標,指向 void

關於指標陣列與陣列指標的區別?

  • 陣列指標(也稱行指標)
    • 定義 int (*p)[n];()優先順序高,首先說明p是一個指標,指向一個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p+1時,p要跨過n個整型資料的長度。

    • 如要將二維陣列賦給一指標,應這樣賦值:

        int a[3][4];
        int (*p)[4]; //該語句是定義一個陣列指標,指向含4個元素的一維陣列。
        p=a;//將該二維陣列的首地址賦給p,也就是a[0]或&a[0][0]
        p++; //該語句執行過後,也就是p=p+1;p跨過行a[0][]指向了行a[1][]
        陣列指標也稱指向一維陣列的指標,亦稱行指標。
  • 指標陣列

    • 定義 int p[n];[]優先順序高,先與p結合成為一個陣列,再由int說明這是一個整型指標陣列,它有n個指標型別的陣列元素。這裡執行p+1時,則p指向下一個陣列元素,這樣賦值是錯誤的:p=a;因為p是個不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它們分別是指標變數可以用來存放變數地址。但可以這樣 p=a; 這裡p表示指標陣列第一個元素的值,a的首地址的值。

    • 如要將二維陣列賦給一指標陣列:

        int p[3];
        int a[3][4];
        p++; //該語句表示p陣列指向下一個陣列元素。注:此陣列每一個元素都是一個指標
        for(i=0;i<3;i++)
        p[i]=a[i];
        這裡int p[3] 表示一個一維陣列記憶體放著三個指標變數,分別是p[0]、p[1]、p[2] 所以要分別賦值。

關於函式指標和指標函式的區別

  • 指標函式是指帶指標的函式,即本質是一個函式。函式返回型別是某一型別的指標
    • 型別識別符號 函式名(參數列) ;具體格式:int f(x,y);

      首先它是一個函式,只不過這個函式的返回值是一個地址值。指標函式一定有函式返回值,而且在主調函式中,函式返回值必須賦給同型別的指標變數。例如:

         01.float fun();
         02.float p;
         03.p = fun(a);
  • 函式指標是指向函式的指標變數,即本質是一個指標變數。 
    * 指向函式的指標包含了函式的地址,可以通過它來呼叫函式。宣告格式如下: 型別說明符 (*函式名)(引數)

      使用的時候:
    
          01.int (f)(int x); /宣告一個函式指標 /
          02.f=func; /將func函式的首地址賦給指標f */

相關文章