1,
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 *strncat(char *dest, const char *src, size_t n)
{
拼接的基础上 多 n控制条件
n < strlen(src) 拼n下就结束 n == 0
n >= strlen(src) src拼完就结束 src=='\0'
*dest = '\0' //?
}
int Strncmp(const char *s1, const char *s2, size_t n)
{
}
//hello
//help //3
2,
指针 + 函数
char * strcpy(); //返回值类型 --- 指针类型 --- 指针的函数 --指针函数
char * strcat();
回调函数
callback
int funcN()
{
}
main()
{
choiceSortN(,funcN); //程序员
}
回调函数: 通过函数指针调用的函数 叫回调函数
技术上: 通过函数指针的实现
函数指针(指向基类型-为函数类型) 函数类型的指针
接口
void qsort(void *base, size_t nmemb, size_t size,int (*compar)(const void *, const void *));
@base 数组起始位置
@nmemb 排序的元素个数
@size 单个元素的大小
@compar 比较函数 //确定进行比较的两个元素的大小规则
int a[10] = {1,2,3,4};
int compar(const void *a, const void *b) 回调函数
{
*(const int *)a - *(const int *)b
}
compar 两个参数 其实表示 数组中某两个元素的地址
compar 返回值 表示的就是数组中两个元素的大小关系
3,
void * //万能指针 --可以接收任意类型的指针
//void类型
注意:
如果通过该类型的地址进行数据访问
一定要转换为 明确类型
4,
char *strcpy(char *dest,const char *src); 返回值为 指针类型 ---指针函数
函数指针 -- 函数的指针 --- 函数类型的 指针
指针函数 -- 指针的函数 --- 返回值为指针类型 的函数
5,
int a[3][4]; 本质还是一维数组
int[4] a[3]; 理解角度
a --数组名 --代表类型 int [3][4]
a --代表的值 -- 首元素的地址 -- a[0]
a[0] 的数据类型 int[4]
&a[0]--对应的数据类型 int(*)[4] //数组类型 (一维整型数组类型)
数组类型的指针 --- 数组指针
int *
int (*p)[4] = a;
*p 三步运算完成后
*p 相当于 是 int[4]这种类型 //数组
*p 就相当于 int[4]这个数组的 数组名
int a = 10;
int *p = &a;
*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)