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/

上一篇:Deja vu of … Go Players


下一篇:04 操作列表