一、&(引用)
引用类型作形参不产生实参的副本,不会占用额外的内存,它直接对实参操作。
二、复杂语句频度计算
for(i = 1;i <= n;i ++)
for(j = 1;j <= i;j ++)
for(k = 1;k <= j;k ++)
x = x + 1;
三、malloc、calloc、realloc函数
使用这些函数需要头文件stdlib.h
void* malloc(size_t size)
返回类型为void*
size_t为无符号整形
size代表要开辟的字节数
开辟成功返回一个指向开辟空间的指针
若分配失败则返回空指针
若size为0,malloc的行为是未定义的,由编译器决定
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
int main()
{
int* p = (int*)malloc(10*sizeof(int));
//可以写成int* p = (int*)malloc(10*sizeof(INT_MAX));INT_MAX代表整形最大值
if(p == NULL)
{
printf("%s",strerror(errno));
}
//当动态申请的空间不再使用时,应还给操作系统
free(p) //使用free释放动态开辟的空间
p = NULL;
return 0;
}
因为malloc返回类型是void*,为了匹配int* p需要强制转换malloc的返回类型。
若分配空间失败,通过使用printf("%s",strerror(errno))返回错误信息
strerror获得错误码所对应的错误信息,需引用头文件string.h
若调用库函数失败会把错误码放到 errno 里面,需引用头文件errno.h
注意,若不使用free系统在结束时会自动释放,但当你使用完这一动态开辟的空间,但后面还有一系列操作时,不使用free会造成空间浪费。
free(p)后,p的的地址不变,仍能通过p找到它指向的那块被释放的空间,安全起见应给p赋值空指针
free(NULL)相当于什么都没干
2.void* calloc(size_t num, size_t size)
num为元素个数
size为每个元素的字节数
作用就是为num个大小为size的元素开辟空间并赋初值为0
int* p = (int*)calloc(10,sizeof(int);
其他与malloc函数相同
3.void* realloc(void* memblock, size_t size)
memblock为之前开辟的内存块
size为新开辟的内存大小
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
int main()
{
int* p = (int*)malloc(10*sizeof(int));
if(p == NULL)
{
printf("%s",strerror(errno));
}
int* ptr = realloc(p,80);//不用前面的p接收realloc返回的地址是因为若开辟失败
//p原来的地址也会变成NULL
if(ptr != NULL)
{
p = ptr;
}
free(p);
return 0;
}
若堆区原来用malloc开辟的动态内存后面的闲置空间足够大,大于要重新开辟的内存空间,则直接在源空间后面连续接着开辟。
若闲置空间不够大,则在后面高地址有足够空间处重新开辟一块空间,再把原来的空间中的值拷贝过来,返回新开辟的内存空间的地址,并把原来的空间free掉。
若还没有开辟动态内存空间,则使用realloc相当于malloc