一、开辟和释放堆区空间
malloc
#include <stdlib.h>
/*
功能:开辟堆区空间
参数:空间字节大小
返回值: 成功:返回堆区空间首地址,失败:返回NULL
*/
void *malloc(size_t size);
在堆区开辟空间,常用格式:
type *a=(type *)malloc(sizeof(type)*n);
若开辟的空间过大,可能会导致开辟失败(此时会返回NULL),因此开辟空间后都要有一个是否开辟成功的判断
int *p = (int *)malloc(sizeof(int) * 10);//没开辟成功会返回NULL
if (p == NULL)//容错判断,判断空间是否开辟成功
{
printf("开辟失败");
return -1;
}
// 只有当指针指向的有确切地址的时候(不是指向NULL),才能直接对其进行赋值操作
*p=66;
free(p);//释放开辟的空间
p=NULL;//避免p变成野指针
free
#include <stdlib.h>
/*
功能:回收开辟的堆区空间
参数:空间首地址
返回值:无
*/
void free(void *ptr);
在free操作以后一定要将指针赋值NULL,避免其变成野指针!!
二、string家族
strlen
求字符串中实际元素个数
#include <string.h>
/*
功能:计算字符串的实际元素个数(字符串长度)
返回值:元素个数
*/
size_t strlen(const char *s);
注意strlen 和sizeof的区别 !!!
strcpy
错过字符串定义时的直接赋值后,想要直接赋值,就得用strcpy()
#include <string.h>
/*
功能:字符串复制
参数:dest:目标字符串(待赋值的字符串) ,src:原字符串(dest想要赋的“值”)
返回值:目标字符串dest首地址
*/
char *strcpy(char *dest, const char *src);
注意:
1.dest必须是可被修改的,不能是只读的,dest也必须是已经开辟好空间的!
因为dest的内容是会被修改的,所以指向在常量区中的字符串的首地址的指针不能做dest(因为p的内容是一个常量,不能改变)
char *p="hello" <--> char const *p="hello" ;
2.当dest与src不等长
dest比src长时:
'\0'也会被复制过去,所以实际dest的长度( sizeof(dest))比打印出来的要长,因为打印时遇到'\0'就认为字符串结束了。
dest比src短时:
会发生越界错误!!
strncpy
#include <string.h>
/*
功能:指定长度的字符串复制(对dest替换指定数目的字符)
参数: dest和src同strcpy()
n:复制前n个字符
返回值:同strcpy()
*/
char *strncpy(char *dest, const char *src, size_t n);

自己实现strcpy():
对在子函数中计算形参大小的问题时,尤其是形参是数组或指针时一定要注意,主函数传入的是否是一个地址(数组名),因为对于地址,64OS中其大小统一为8B。
例:
strcat
去掉dest的'\0'然后再拼接
注意越界的问题!!
#include <string.h>
/*
功能:实现字符串拼接
参数:dest:目标字符串首地址 src:原字符串首地址
返回值:目标字符串首地址
*/
char *strcat(char *dest, const char *src);

自己实现strcat()
strcmp
#include <string.h>
/*
功能:字符串比较
参数:两个字符的首地址
返回值: s1-s2
*/
int strcmp(const char *s1, const char *s2);
从头到尾依次比较,一旦不同,则比较结束(即对应位置字符比较)
返回值就是不同的那一对字符的ASCII码差值(int d=*s1-*s2)
d=0 => s1==s2
d<0 => s1<s2
d>0 => s1>s2
自己实现strcmp
三、递归函数
经典名句:自己调用自己
递归:递推与回归
例:求阶乘

注意:递归一定要有结束条件!!!(何时结束递推进行回归)且每次调用一定要越来越接近结束条件








247

被折叠的 条评论
为什么被折叠?



