c的函式指標與記憶體
阿新 • • 發佈:2020-12-22
動態分配記憶體
要分配10個int,一個int佔幾位,10個int一共多少位就拿出多少記憶體
#define PLAYER_COUNT 10
int *players = malloc(sizeof(int)*PLAYER_COUNT);
//print 使用
for(int i=0;i<PLAYER_COUNT;i++){
players[i] = i;
}
PRINT_INT_ARRAY(players);
free(players);
在使用完malloc之後要free掉記憶體。
傳入的如果只是一個單一的指標,形參指標變數本身被複制,操作完一波之後就會被銷燬。所以當他是一個形參的時候需要傳入一個指標指向傳入的指標,即為(**ptr)。
如果想要指標作為引數傳入,則形參應該是作為一個指標的指標(即一個指標指向另一個指標)。如下面的程式碼所示,當你傳入的是 *players
,這個變數的地址的時候,需要有一個指標指向 *players 這個指標。即把players的地址給那個指向的指標。*(*ptr) = &players
void InitPointer(int **ptr,int length,int default_value){ *ptr = malloc(sizeof(int )*length); for (int i = 0; i < length; ++i) { // 先給指標取到間接引用(*ptr)指向的是*player (*ptr)[i] = default_value; } }
calloc這個函式直接初始化為0
realloc是直接重新分配 可以追加記憶體,但是不會做清空。
函式指標
定義一個變數來指向一個函式,eg
void (*func)(int **ptr,int length,int default_value)=&InitPointer;
func為指標的變數名字
int *p;
func(&p,10,0);//可以呼叫
如果想要看的清楚一些,則用 (*func)(&p,10,0) 這種方法就是解應用。tips:要學會區分返回的是指標還是函式指標型別。
給函式型別起一個別名來簡化型別
typedef type name
比如說對於函式型別起一個別名,那麼便是 typedef int (*Func)(int,double)
Func func = &Add;
學會使用這個網站進行尋找函式型別 https://cdecl.org/