C語言-指針

複雜函數指針數組

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 ******************************************************************/
相關文章
相關標籤/搜索