[C] 關於pointer與型態宣告
複習一下pointer...
(1)pointer: 指標, 用來儲存資料物件的記憶體位址.
ex.
int var = 8;
int *ptr = &var;
//儲存var位址的指標變數ptr(或說是指向變數var的指標ptr), 其var 為int type
int **pptr = &ptr; <=> int* (*pptr) = &ptr;
//儲存ptr位址的指標變數pptr, 其中ptr為int* type
(2)*VARIABLE_NAME 可以取出所指向的位址物件的數值.
ex.
printf(" *ptr=%d\n", *ptr); // 8
printf(" *pptr=%u\n", *pptr); // memory address of var
NOTICE 1: *pptr得到的是所存位址(即ptr的位址)的數值(ptr存的是var的位址)
NOTICE 2: 不管宣告時有幾個'*', 指標變數,存的就是資料物件的位址.
printf("**pptr=%d\n", **pptr); //8
另外就是宣告的型態:
(I) int arr[8][8]; //int array的array(II) int **pptr; //指向int type pointer的pointer(III) int *parr[8]; //8個指向 int type pointer的array(IV) int (*parr)[8]; //指向int array的pointer(V) int *parr2[7][8]; //指向int type pointer的7x8array(VI) int (*parr2)[7][8]; //指向7x8array的pointer(VII)int (*parr2[7])[8]; //7個指向int type array的array
int *parr[7][8]; 表示parr是一個有7個elements的array, 每個element皆有8個指向int的指標陣列; in brief, 一個7x8指向int的指標陣列.
另外就是函數指標:
char *pfunc(); //表示一個pfunc函式, 回傳指向char的指標
char (*pfunc)(); //表示一個pfunc指標, 指向一個回傳char型態的函式
char (*pfunc[3])();//表示3個指向回傳為char型態的函式的陣列
void (*pfunc)(char*); //表示一個函式指標, 指向一個無回傳值且帶入參數為一個指向char型態的函式.
void *pfunc(char*); //表示一個回傳值為指標的函式pfunc, 其傳入參數為指向char型態.
void demo(void (*pfunc)(char*), char*); //表示一個函式demo, 其傳入參數為函式指標與一個指向char.
可以用typedef來簡化函式指標: typedef void (*PFUNC)(char*);
這樣 void demo(void (*pfunc)(char*), char*); => void demo(PFUNC, char*);
嗯, 希望下此碰到pointer不會再這麼毛...
(1)pointer: 指標, 用來儲存資料物件的記憶體位址.
ex.
int var = 8;
int *ptr = &var;
//儲存var位址的指標變數ptr(或說是指向變數var的指標ptr), 其var 為int type
int **pptr = &ptr; <=> int* (*pptr) = &ptr;
//儲存ptr位址的指標變數pptr, 其中ptr為int* type
(2)*VARIABLE_NAME 可以取出所指向的位址物件的數值.
ex.
printf(" *ptr=%d\n", *ptr); // 8
printf(" *pptr=%u\n", *pptr); // memory address of var
NOTICE 1: *pptr得到的是所存位址(即ptr的位址)的數值(ptr存的是var的位址)
NOTICE 2: 不管宣告時有幾個'*', 指標變數,存的就是資料物件的位址.
printf("**pptr=%d\n", **pptr); //8
另外就是宣告的型態:
(I) int arr[8][8]; //int array的array(II) int **pptr; //指向int type pointer的pointer(III) int *parr[8]; //8個指向 int type pointer的array(IV) int (*parr)[8]; //指向int array的pointer(V) int *parr2[7][8]; //指向int type pointer的7x8array(VI) int (*parr2)[7][8]; //指向7x8array的pointer(VII)int (*parr2[7])[8]; //7個指向int type array的array
int *parr[7][8]; 表示parr是一個有7個elements的array, 每個element皆有8個指向int的指標陣列; in brief, 一個7x8指向int的指標陣列.
另外就是函數指標:
char *pfunc(); //表示一個pfunc函式, 回傳指向char的指標
char (*pfunc)(); //表示一個pfunc指標, 指向一個回傳char型態的函式
char (*pfunc[3])();//表示3個指向回傳為char型態的函式的陣列
void (*pfunc)(char*); //表示一個函式指標, 指向一個無回傳值且帶入參數為一個指向char型態的函式.
void *pfunc(char*); //表示一個回傳值為指標的函式pfunc, 其傳入參數為指向char型態.
void demo(void (*pfunc)(char*), char*); //表示一個函式demo, 其傳入參數為函式指標與一個指向char.
可以用typedef來簡化函式指標: typedef void (*PFUNC)(char*);
這樣 void demo(void (*pfunc)(char*), char*); => void demo(PFUNC, char*);
嗯, 希望下此碰到pointer不會再這麼毛...
Comments
Post a Comment