1. 二级指针
二级指针是指针的指针
int **p;//定义一个二级指针
int *q[10]; //定义一个指针数组,数组中每个元素是一个指针
可以定义一个指针数组,每个元素分别指向一个数组的地址,
for(int i = 0; i < 10; i++)
{
q[i] = &arr[i];
}
2.malloc动态申请空间大小
malloc可以动态申请一个空间大小,
p = (类型*)malloc(sizeof(int) * 10)
就可以申请一个10个int空间大小的空间
用malloc后需要用memset()对空间进行初始化
memset(p, 0, 40);
对每一个空间的值进行初始化,赋上0
记得用完这个空间后需要释放空间,否则可能出现内存泄漏
free(p);
最后要将p指向NULL成为一个空指针,要不就变成了野指针,发生不可预期的错误
3. colloc动态分配空间
用法和malloc类似,只不过在申请的时候已经为空间清零了
定义方式:
p = (类型 *)calloc(元素个数, sizeof(类型));
这个方式和malloc和mement一起用等价,后面的使用方法也相同(释放空间,指针指向NULL)
4.realloc重新分配空间大小
之前申请了空间,觉得空间不够,可以再申请一些空间,就用到了realloc函数
p = realloc(要为那个地址申请空间, 空间大小);
申请完后,之前的空间会被自动释放
总结:
这是一些容易记混的概念
(1)a是一个一维数组的首地址,a+1的意思是指针指向后一个元素的地址
(2)b是一个二维数组,b+1的意思是指针指向下一行的元素首地址,如果是&b+1,他就是将指针移到二维数组的后面,挪了整个数组
(3)sizeof(数组名),这个是计算出整个数组的大小
(4)sizeof(二维数组的地址)这个意思是二维数组一行占的大小
(5)sizeof(一个值的地址)计算的是地址占空间大小,与系统位数有关64位系统是8个字节,32位系统是4个字节