动态分配内存
要分配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/