1、谈谈你对指针的理解?(指针是什么?)
指针是一种数据类型,它可以定义变量,变量保存的值是地址,由于地址是固定长度,所以指针变量的长度是固定长度;不同地址的步长不一样,导致需要不同指针类型的变量来保存;
工程应用作用:由于指针变量可以保存地址,所以可以直接操作地址,也就是可以直接操作硬件的寄存器地址,从而实现直接访问硬件;
int * p;//整型指针变量:p是一个变量,保存的是地址,该地址是整型类型的地址;
char * p2;//字符指针变量:p2是一个变量,保存的是地址,该地址是字符类型的地址
问题:地址为什么分为了不同类型?–》不同类型的指针变量保存不同步长地址
地址属性:步长(做加1操作所移动的字节数)
地址 + 操作数 = 地址;
eg:0x00000001 + 1 = ?0x00000002 或0x00000004
支持的运算符:
*:间接运算符 &:取地址运算符(对应的内存空间、指向的内存空间)p++:p对应的内存空间(*p)++:p指向的内存空间
多级指针:保存上一级指针变量的地址;(远指针(巨指针)、近指针、)
变量的三大特点:占用存储空间、生命周期、存储区域
注:什么时候使用多级指针?(应用场景:函数传参)
指针之间的运算:
赋值:指针之间赋值:相同类型指针之间赋值;
注:*void ;万能指针:
可以接收任何类型指针的值
运算+:p +/- 操作数 指针 - 指针:相差数据类型的个数
不允许:指针+ 指针
使用注意事项:
1、野指针
2、指针变量的空间分配方式:动态;
编程:统计一个字符串中连续最长数字子串的个数并输出
#include <stdio.h> #include <stdlib.h> int continue_max_str(char *src) { int len = 0; int max_len = 0; while(*src != '\0') { while((*src >= '0' && *src <= '9') && *src != '\0') { len++; src++; } if(len > max_len) { max_len = len; } len = 0; src++; } return max_len; } int main(int agrc, char *argv[]) { char *src = (char *)malloc(sizeof(char) * 100); printf("Plesae input src:\n"); scanf("%s", src); printf("src = %s\n", src); int max_len = continue_max_str(src); printf("the max len = %d\n", max_len); return 0; }
野指针:
1、什么是野指针:
定义未初始化的指针、释放结束之后的指针、越界访问的指针
注:char *p;
野指针:指针变量里保存的地址对应空间无访问权限;(指针变量所指向的内存空间无访问权限)
2、野指针产生的问题:
内存泄漏——运行时错误——内存错误(段错误)
3、如何避免野指针:
养成良好的编码习惯:
1、定义指针变量时必须初始化
当指针变量作为指向工具时,定义时初始化为NULL;
当向指针变量指向的空间赋值时,需要给动态申请空间;
2、使用时:
检查内存空间是否分配成功;
初始化内存空间;
使用的时候防止越界访问
3、使用结束时:
必须释放空间;
释放之后一定要将指针再次置为NULL;
NULL:
#define NULL (void *)0
NULL:代表的是0地址(不能访问,不能存储数据)
内存空间分配方式:
1、静态分配:开销小,但是空间利用率不高;
2、动态分配:开销大,提高空间的利用率;
动态分配:以字节为单位(在堆空间分配)
malloc:void * malloc(size_t size); size:sizeof(类型) * 数量
char p = (char)malloc(sizeof(char)*100);
注意事项:检查是否分配成功;返回值类型转换(相同指针类型赋值);大小必须通过sizeof(类型)*数量(保证足够的空间)
calloc:void * malloc (size_t bmem,size_t size);
char *p = (char *)calloc(sizeof(char),100);
malloc VS calloc:初始化为0;
realloc:void * realloc(void *ptr,size_t size);
当ptr置为NULL时,相当于malloc;malloc(100) == realloc (NULL,100);
当ptr不为NULL时,
size小于原来分配的空间大小,数据不会丢失,但是存在越界访问的可能;
size大于原来分配的空间大小,数据不会丢失,但是指针的指向会发生改变,因为realloc的机制是重新分配并不是追加,所以realloc开销比较大(拷贝)
size == 0,相当于free();realloc(p,0) == free(p);
//char *p = (char *)malloc(sizeof(char ) 10000);
动态分配内存为什么开销比较大?
多分配了内存用来保存使用内容信息;
如何降低malloc的开销?
内存池