複雜函數指針數組
Think in C++中介紹了一種複雜函數指針的分析方法
ide
右左法則:首先從最裏面的圓括號看起,而後往右看,再往左看。每當遇到圓括號時,就應該掉轉閱讀方向。一旦解析完圓括號裏面全部的東西,就跳出圓括號。重複這個過程直到整個聲明解析完畢。函數
void (*funcPtr)(); // funcPtr 是一個函數指針,該指針指向的函數沒有參數,沒有返回值。void *(*(*fp1)(int))[10]; // fp1 是一個指向函數的指針,該函數擁有一個int型的參數,返回值是一個指向擁有10元素的指針數組,數組中每一個元素都是void * 類型。float (*(*fp2)(int,int,float))(int); // fp2 是一個指向函數的指針,該函數擁有三個參數,分別是int,int和float類型,返回一個指向函數的指針,該函數擁有一個int型的參數,返回值是float類型。typedef double (*(*(*fp3)())[10])(); // fp3 是一個指向函數的指針,該函數沒有參數,返回一個指向擁有十個元素的數組,數組的每一個元素是一個函數,這10個函數都沒有參數,返回值是double類型。int (*(*f4())[10])(); // f4是一個函數,返回值是一個指向擁有10個元素的數組,每一個數組元素是一個函數指針,這些指針指向的函數返回值爲int類型。
1 /** 2 * main函數的參數 3 * main函數能夠理解爲操做系統調用的函數 4 * 在執行程序的時候能夠向main函數傳遞參數 5 * int main() 6 * int main(int argc) 7 * int main(int argc, char *argv[]) 8 * int main(int argc, char *argv[], char *env[]) 9 * argc - 命令行參數個數 10 * argv – 命令行參數數組 11 * env – 環境變量數組 12 */ 13 14 15 /*普通指針*/ 16 int *p; 17 18 19 /** 20 * 數組指針 21 * 數組指針用於指向一個數組 22 * 數組名是數組首元素的起始地址 , 但並非數組的起始地址 23 * 經過將取地址符& & 做用於數組名能夠獲得數組的起始地址 24 * 可經過數組類型定義數組指針 : ArrayType* pointer; 25 * 也能夠直接定義 :type (*pointer)[n]; 26 * pointer 爲數組指針變量名 27 * type 爲指向的數組的類型 28 * n 爲指向的數組的大小 29 */ 30 int buf[6]; 31 32 //直接定義: 33 int (*p)[n] = &buf; 34 35 //數組類型重命名定義: 36 typedef int(INT6)[6]; 37 INT6 *p1 = &buf; //數組指針,sizeof(p1) = 6 * sizeof(int) = 24字節 38 INT6 p2; //數組。p2 == int p2[6] 39 40 41 /** 42 * 指針數組 43 * 指針數組是一個普通的數組 44 * 指針數組中每一個元素爲一個指針 45 * 指針數組的定義 :type* pArray[n]; 46 * type* 爲數組中每一個元素的類型 47 * pArray 爲數組名 48 * n 數組的大小 49 */ 50 int *p[n]; 51 52 53 /** 54 * 函數指針 55 * 函數指針用於指向一個函數 56 * 函數名是執行函數體的入口地址 57 * 可經過函數類型定義函數指針 : FuncType* pointer; 58 * 也能夠直接定義 :type (*pointer)(parameter list); 59 * pointer 爲函數指針變量名 60 * type 爲指向函數的返回值類型 61 * parameter list 爲指向函數的參數類型列表 62 */ 63 //直接定義: 64 int (*p)(void); 65 66 //數組類型重命名定義: 67 typedef int(*HSZZ)(void); 68 HSZZ hszz; 69 70 71 /************************************************************ 72 * 等價關係 73 * 74 * 數組參數 等效的指針參數 75 * 一維數組:float a[5] 指針: float *a 76 * 指針數組: int* a[5] 指針的指針:int** a 77 * 二維數組: char a[3][4] 數組的指針:char (*a)[4] 78 *============================================================ 79 * a 和&a 的區別 80 * char a[]={1, 2, 3, 4, 5}; 81 * a爲數組是數組首元素的地址 82 * &a爲整個數組的地址 83 * a和&a的意義不一樣其區別在於指針運算 84 *-----------------------------------------------------------*/ 85 a + 1 = (unsigned int)a + sizeof(*a) 86 &a + 1 = (unsigned int)(&a) + sizeof(*&a) = (unsigned int)(&a) + sizeof(a) 87 88 /***************************************************************** 89 * 注意;當指針取變量地址時,指針必需要和變量類型同樣,否則會提取到錯誤(注意:此 90 * 處的錯誤並非說裏面的數據有錯誤,而是說提取的數據不是你想要的)數據,若是運氣 91 * 好點會直接發生段錯誤。 92 * 93 * 若是是改變變量的值時,指針類型比變量類型不一樣,用指針改變變量時,變量的值是未知的; 94 * 運氣好的話也會發生段錯誤,悲催點那就須要本身調試程序,排除錯誤咯。 95 * 96 * 舒適提醒:除非是特地而爲的,不然最好不要這樣!!! 97 * 98 * char 型指針 *char 提取1字節數據 99 * short 型指針 *short 提取2字節數據100 * int 型指針 *int 提取4字節數據101 * long 型指針(若是是8字節) *long 提取8字節數據102 * long long 型指針(若是是16字節) *long long 提取16字節數據103 ******************************************************************/