1. 程式人生 > 實用技巧 >c的函式指標與記憶體

c的函式指標與記憶體

動態分配記憶體

要分配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這樣的型別,定義的函式引數傳入的是int和double,返回的是int型別

Func func = &Add;

學會使用這個網站進行尋找函式型別 https://cdecl.org/