char *strncpy(char *dest, const char *src, size_t n)
定义一个 char * 类型的函数;其中dest为复制到这个地址,src为要复制的目标;n为复制src的前n 个;
n < strlen(src) 只拷贝前n个字符,没有完全复制,没有到达'\0';最终dest中不会有 '\0'
n == strlen(src) 正常拷贝
n > strlen(src) 如果 n 拷贝够了次数 把src全部拷完,到达‘\0’ ; 剩余拷贝 统统补0;
也就是 当 *src == '\0' 时 还有剩余,后面全部补 0 ;
char *strncat(char *dest, const char *src, size_t n)
定义一个 char * 类型的函数;其中dest为拼接到这个后面,src为要在后面拼接的后续字符串;n为拼接 src 的前n 个;
n < strlen(src) 把src 的前 n 个 续接到dest后面,注意要覆盖dest后面的'\0',从dest的最后一个字符开始,覆盖 '\0',拼接完成后再在最后加'\0';
n >= strlen(src) src拼完就结束 当 src=='\0' 时结束拼接;
int Strncmp(const char *s1, const char *s2, size_t n)
定义一个int 型的函数;其中 s1 和 s2 均被 const 为只读,不能被修改;比较s1与s2 的前n 个字符;
通过函数指针调用的函数 叫回调函数
回调函数时,一般是主函数调其他定义的函数,而其他那些被定义的函数一般都留有接口;
void qsort(void *base, size_t nmemb, size_t size,int (*compar)(const void *, const void *));
定义为一个空类型的函数,方便后续定义为其他类型函数;其中
void * 为万能指针 ;可以接收任意类型的指针
如果通过该类型的地址进行数据访问 一定要转换为 明确类型
base 为数组起始位置;数组首元素<=>数组名;一般直接写数组名
nmemb 为要排序的元素个数;就是要排序的那些东西 的个数,
size 为单个元素的大小;要排序的那些东西的单个的 大小,一般直接在外面sizeof(单个元素);
如一维数组的话 sizeof(a[0]) ; 二维数组sizeof(a[0]):确定第一排的元素大小,sizeof(a[0][0])确定第一排第一个的元素大小;看你要比较那个,如字符串的话就用a[0],单个数字或字符或字符的话就用a[0][0];而第二行的话,就要取地址sizeof(*(a+1));
compare 为比较函数;这个函数需要自己进行确定,看你要怎么进行比较;字符串一般可以调用string.h;此处compare为指针函数;
int compar(const void *a, const void *b) //回调函数
{
*(const int *)a - *(const int *)b ;
}
比较不可修改的两个值; compar 两个参数 是 数组中某两个元素的地址
compar 返回值 表示的就是数组中两个元素的大小关系
函数指针 -- 函数的指针 --- 函数类型的 指针 (直接指向别的函数:int (*函数名));
指针函数 -- 指针的函数 --- 返回值为指针类型 的函数 (int * 函数名)
int a[3][4]; // 本质还是一维数组 可以写成:
int[4] a[3]; 数组名为a 也代表首元素地址a[0],a[0]的类型为 Int [4]型;
&a[0] 对应的 数据类型为int (*)[4];
int (*p)[4] = a; *p 相当于 是 int[4]这种类型 的 数组
*p 就相当于 int[4]这个数组的 数组名
*(*(p+i) + j)<=>a[i][j]
p==a[0]相当于 a[i]的第一层或第一片(也就是a[0])的地址;这个地址代表了 [ j ] (0到j) 这一片;
而(p+i)则是确定在第几层的地址;*(p+i)则是走到第几层进入里面 同样也是这一层里面的首地址 ;同样拥有 [ j ] 这一排片;
[ j ]则代表了某一层所有的元素个体;从0到j;