指针
指针是一种数据类型,它可以定义变量,变量保存的值是地址,由于地址是固定长度,所以指针变量的长度是固定的;不同地址的步长不一样,需要不同指针类型的变量来保存
*:间接运算符
&:取地址运算符(对应的内存空间,指向的内存空间)
(“&”和“*”都是右结合的。假设有变量 x = 10,则*&x 的含义是,先获取变量 x 的地址,再获取地址中的内容。因为“&”和“*”互为逆运算,所以 x = *&x。)
p++:p对应的地址自加
(*p)++:p指向的地址的内容进行自加
什么时候使用多级指针?
应用场景:函数传参
野指针
a)什么是野指针?
定义未初始化指针
释放结束之后指针
越界访问的指针
如: char *p
野指针:指针变量里内存的地址对应空间无访问权限(指针变量所指向空间无访问权限)
b)野指针产生的问题?
内存泄漏---运行时错误---内存错误(段错误)
c)野指针的注意事项:
1、指针指向常量存储区对象
2、资源泄露
3、内存越界
4、返回值是指针
5、指针做形参
d)如何避免野指针?
养成良好的编码习惯:
1)定义指针变量时必须初始化:
当指针变量作为指向工具时,定义时初始化为NULL;
当向指针变量指向的空间赋值时,需要给动态申请空间
2)使用时:
检查内存空间是否分配成功
初始化内存空间
防止越界访问
3)使用结束时:
必须要释放空间
释放之后一定要将指针再次初始化为NULL
NULL:#define NULL (void *)0
NULL代表的是0地址(不能访问,不能储存数据段)
char *p = NULL;//EOF
注意:野指针不能杜绝,只能避免!!!
malloc、free、calloc、realloc:
a)malloc:
void * malloc(size_t size);
这个函数可以再堆区上开辟内存连续可用的空间:
如果开辟成功,则返回一个指向开辟好空间的指针
如果开辟失败,则返回NULL指针,因此malloc的返回值一定要做检查
由于返回值的类型是void *,所以malloc函数并不知道开辟空间的类型
具体在使用的时候由使用者自己来决定
如果参数size为0,malloc的行为的标准是未定义的,取决于编译器
b)free:
void free(void * ptr);
如果参数ptr指向的空间不是动态开辟的,那么free函数的行为是未定义的
如果参数ptr是NULL指针,则函数什么是都不用做
c)calloc:
void * callloc(size_t num,size_t size);
calloc与malloc的开辟方式唯一的不同点是在开辟内存的同时初始化
d)realloc:
void * realloc(void * ptr,size_t size);
realloc函数可以对动态开辟内存大小的调整
ptr是要调整的内存地址size调整之后新大小返回值为调整之后的内存其实位置
这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间:
1)原有空间之后有足够大的空间
2)原有空间之后没有足够大的空间