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 */