iOS开发学习笔记 2-9 C语言部分 内存分配函数 函数指针 指针函数 void*

一、内存分配函数

1、void * malloc(参数(需要分配的内存空间的大小));
void * malloc(参数1(元素所占用空间大小) * 参数2(元素个数));
不会进行清零操作

2、void * calloc (参数1(元素个数), 参数2(每个元素所占用空间大小));
会进行清零操作

3、void * realloc(参数1(需要再次分配内存空间的指针),参数2(需要再次分配内存大小,可以写成“sizeof(元素类型)* 元素个数”);
会将之前分配的内存释放掉,重新分配后把原来内存空间的值拷贝到新地址
如果直接把新分配的地址覆盖原来的地址是有风险的,一旦内存分配失败,原来的值就丢失了;为了防止分配失败导致原来的内容丢失,可以申明一个中间变量来保存新地址,分配成功后再将新地址赋给旧地址;
例如:
int *p = malloc(sizeof(int) * 5); //分配5个sizeof(int)大小的地址
int *Newp = realloc(p, sizeof(int) * 5); //在p的基础上再分配5个sizeof(int)大小的地址,并赋值给p1
if(p != NULL); //判断内存是否分配成功
p = Newp; //p已经在上一步被realloc函数释放,将p1的值赋给p

4、释放内存
     free(p);

5、防止野指针问题:
     p = NULL;

二、函数的指针

1、函数保存在代码区,用指针存储函数在代码区的首地址,通过指针偏移对函数进行访问,函数名就是函数的指针名,也是函数的首地址名;
2、函数的指针可以用作参数,那么函数也可以用作参数。传入函数指针的参数类型和它的返回类型一致;

三、指针函数

返回类型为指针的函数;

四、void *
1、指向任何类型的指针,malloc分配对内存时,由于无法确定内存的存储类型,所以可以使用void *代表任意类型的指针。
2、不能直接对void *指针进行*运算,在进行*运算之前要先进行强制类型转换(type *)p;
3、void *能进行加减操作,但是是以字节为单位进行运算,在运算之前最好先转换成目标类型。

你可能感兴趣的:(c,Objective-C,C语言,ios开发,移动互联网)