总结
1.快速排序
注意:
第二三步并不能反过来 要想降序排列只需要加将比较的符号换一下
2.指针操作一维字符型数组
(const) char *s = "hello";
*s='H'; //错误
char s[]="hello";
s[0] = 'B'
char *strncpy(char *dest, const char *src, size_t n)
{
正常拷贝
多了 一个n
n < strlen(src)
只拷贝前n个字符,最终dest中不会有'\0'
n == strlen(src)
正常拷贝
n > strlen(src)
if (n) 拷贝够了次数
剩余拷贝 统统补0
}
思路:
// 结束条件 *src == '\0'
// n次 拷贝完成没有
char *Strcpy(char *dest,const char *src)
{
char *ret = dest;
while (*dest = *src)
{
dest++;
src++;
}
return ret;
}
char *Strncpy(char *dest,const char *src,size_t n)
{
char *ret = dest;
while (n && (*dest = *src) )
{
dest++;
src++;
--n;
}
//printf("n= %ld\n",n);
while(n)
{
*dest = 0;
++dest;
--n;
}
return ret;
}
char *strncat(char *dest, const char *src, size_t n)
{
拼接的基础上 多 n控制条件
n < strlen(src) 拼n下就结束 n == 0
n >= strlen(src) src拼完就结束 src=='\0'
*dest = '\0' //?
}
char * Strcat(char *dest, const char *src)
{
char *ret = dest;
while (*dest != '\0')
dest++;
while((*dest = *src) != '\0')
{
dest++;
src++;
}
return ret;
}
char * Strncat(char *dest, const char *src,int n)
{
char *ret = dest;
while (*dest != '\0')
dest++;
//
//hello'\0'
while(n && *src != '\0')
{
*dest = *src;
dest++;
src++;
--n;
}
*dest = '\0';
return ret;
}
int Strncmp(const char *s1, const char *s2, size_t n)
int Strcmp(const char *s1,const char *s2)
{
while (*s1==*s2 && *s1!='\0' && *s2 != '\0')
{
++s1;
++s2;
}
return *s1 - *s2;
}
int Strncmp(const char *s1,const char *s2,int n)
{
//3
//2
//1
n--;
while (n&&*s1==*s2 && *s1!='\0' && *s2 != '\0')
{
++s1;
++s2;
--n;
}
return *s1 - *s2;
}
总结:
1.指针操作一维字符型数组(字符串)
2.函数
grts
puts
strlen
strcpy/strncpy
strcap/strncat
strcmp/strncmp
注意:
1.const 能加的都加
2.函数功能尽可能写的全面
指针+函数
char *strcpy();//返回值类型是指针类型的函数
char *strcap();
回调函数
回调函数:通过函数指针调用的函数叫回调函数
技术上:通过函数指针的实现
函数指针(指向基类型-为函数类型)函数类型的指针
接口
void qsort(void *base,size_t nmemb,size_t size, int (*compar) (const void *,const void *));
@base 数组起始位置
@nmemb 排序的元素个数
@size 单个元素的大小
@compar 比较函数 / /确定进行比较的两个元素的大小规则
void * //万能指针------任意类型性的指针
//void型
注意:如果通过该类型的地址进行数据访问 一定要转转换成明确的基类型。
总结:
1.指针操作函数
2.函数名就是函数入口地址
3.定义一个函数指针便变量获得函数名
4.使用:通过指针变量获得函数名
5.用途:回调
函数指针 -- 函数的指针 --- 返回的类型是函数类型的 指针
指针函数 -- 指针的函数 --- 返回值为指针类型 的函数
指针+二维数组
int a[3][4]; //本质还是一维数组
int[3] a[4]; //理解角度
//a----数组名---代表类型----代表类型是 int[3][4]
//a代表的值是首元素的地址-----a[0]
//a[0]的数据类型是int [4]
//&a[0]-----对应的数据类型 int (*)[4]
//数组类型的指针是数组指针
*p //三步运算完成后
*p 相当于 是 int[4]这种类型 //数组
*p 就相当于 int[4]这个数组的 数组名
*p <=> a
*(*(p+i) + j)<=>a[i][j]
p+1 //偏移到了 下一个 int[4]
//类型为int(*)[4]
*(p+1) //偏移到下一个int
//*(p+1) 代表的类型int[4] 此时相当于是 int[4]的数组名
//*(*(p+1) + 1)