一、字符串(掌握)
1、字符串指针
【注】使用字符串指针指向一个字符串时,不能使用指针来改变字符串的内容。
2、字符串库函数
(1)atoi():将一个数字字符串转换成对应的整数。
(2)strlen():求字符串有效长度。
【扩展】strlen和sizeof的区别
(1)strlen是库函数,sizeof不是。
(2)strlen获取实际字符个数,sizeof获取占用内存大小。
(3)strcmp():比较两个字符串
返回值:返回整型值:
如果后面的字符串的某个字符比前面的大,返回值小于零(ASCII码相减)
如果后面的字符串的某个字符比前面的小,返回值大于零(ASCII码相减)
如果后面的字符串与前面的字符串完全相同,返回值等于零
(4)strcpy()将后面的字符串常量拷贝到前面的字符串指针指向的存储区
注意事项见5.c
练习:自己实现strcpy()
char * mystpcpy(char *dst, const char *src);
【扩展】解决字符数组越界的问题,可以使用strncpy
(5)strcat()在原有字符串的基础上追加字符串。
【注】原有字符串所在的内存空间要能容纳下追加的字符串。
(6)strstr()查找并返回第二个字符串在第一个字符串中第一次出现的位置。
二、函数指针
1、声明并初始化函数指针
声明格式:
返回值类型 函数指针名(参数列表) = 函数名;
2、函数指针的使用
见10.c
3、函数指针作为函数的参数
见11.c
三、静态内存分配
1、定义:在编译阶段就确定大小,程序运行的时候,由OS进行分配,使用完成之后,由OS统一释放。
2、优点:无需人工干预,效率高。
3、缺点:内存使用率低,内存浪费。
【注】栈空间采用静态内存分配
四、动态内存分配
动态内存分配主要在堆区
1、在程序运行过程中,根据需要随时申请,用完之后可以立即释放。
2、优点:节省内存,内存使用率高。
3、缺点:需要人工参与,用完之后需要手动释放,申请有可能会失败,需要有异常处理机制。
4、生命周期:从申请开始到释放结束。
5、申请和释放
申请:malloc
释放:free
【潜在风险】
(1)忘记释放,会造成内存泄露。
(2)过早释放,可能会造成野指针。
(3)多次释放,会造成程序崩溃。
如果p在释放后,置为NULL,那么free多少次,都没问题。
如果p在释放后,没有被置为NULL,那么free多次后会造成程序崩溃。
【扩展】堆和栈的区别
(1)栈:由系统自动分配和释放内存。例如声明在函数中的局部变量 int a;系统会自动在栈区为a开辟内存空间。
(2)堆:需要程序员手动申请,并指明大小,用完之后释放。
例子详见2.c
五、【扩展】复杂指针(了解)
1、二级指针
2、指针数组和数组指针
数组指针:是指向数组的指针。
指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。
六、【扩展】typedef关键字(OC要使用)
1、作用:是给基本或自定义数据类型起别名
2、typedef与指针
3、typedef与函数指针