指针

#

  • int (*p)[4] 是行指针变量, p[0]+1 指向的是 p[1] ;
  • int *p[4] 是指向4个元素的指针数组
  • a[i]+j == &a[i][j] a[i][j] == *(a[i]+j)

动态内存的申请与释放#

malloc()函数#

函数原型 void *malloc(bit_num)

从 内存堆 上申请指定字节数的内存块,并返回该内存块的首地址

调用格式

1
2
3
4
5
6
char *p;
double **q;
int (*a)[4];
p = (char *)malloc(sizeof(char)*20);
p = (double **)malloc(sizeof(double)*10);
p = (int (*)[4])malloc(sizeof(int)*4*5);

一般需搭配 free() 在使用后倒序释放内存

注意: 若内存申请不成功 malloc() 将返回空指针( NULL )以作标识

calloc()函数#

函数原型 void *calloc(size_t n, size_t size);

在内存的动态存储区申请 n 块长度为size的连续空间

调用格式 指针名 = (数据类型 *)calloc(n, size);

realloc()函数#

函数原型 void *realloc(void *mem_address, size_t newsize);

在原已申请的内存块 mem_address 上再申请一块内存块

执行逻辑是,判断 mem_address 后是否有连续空间,若有则扩大并将 mem_address 返回,若无则新申请一块并将原有数据搬迁,并自动释放原地址,若申请不到则返回 NULL

调用格式 指针名 = (数据类型 *)realloc(指针名, 新内存长度);

free()函数#

void free(void *ptr)

释放顺序最好与申请顺序相反,以免产生内存碎块。