一. 三个函数
1.strncpy
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
}
2.strncat
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' // 手动添加字符串结束标志
}
2.strncmp
int Strncmp(const char *s1, const char *s2, size_t n)
{
}
char * s1 = "helloaalajldahelloadflajdhellolkahldfjlhello"
strncmp(s1,"hello",5);
总结:
1.指针操作一维字符型数组(字符串)2.函数
gets
puts
strlen
strcpy /strncpy
strcat /strncat
strcmp /strncmp
注意:
1.const 能加都加 ----- 保护数据,避免无意识的修改
2.函数功能 ------ 在实现主要功能的前提下,尽可能写的全面(考虑临界情况)
指针 + 函数
char * strcpy(); //返回值类型 --- 指针类型 --- 指针的函数 --指针函数
char * strcat();
二. 回调函数
1.形式:
int funcN() //自己写的
{
}
main() //自己写的
{
choiceSortN(,funcN); //别人写的 (留好接口)
}回调函数: 通过函数指针调用的函数 叫回调函数
(在主调中 调用别人写的函数时,别人写的函数会回过头来调用你自己写的函数)
技术上: 通过函数指针来实现 ,函数指针(指向基类型-为函数类型) 函数类型的指针eg:函数名 *p // p即为函数指针
2. qsort
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
@base 数组起始位置
@nmemb 排序的元素个数
@size 单个元素的大小
@compar 比较函数 (确定两个元素进行比较的的大小规则)
int compar(const void *a, const void *b) // 为回调函数
{
*(const int *)a - *(const int *)b
}
compar 两个参数 其实表示 数组中某两个元素的地址
compar 返回值 表示的就是数组中两个元素的大小关系
void * //万能指针 --可以接收任意类型的指针
注意: 如果通过该类型的地址进行数据访问, 一定要转换为 明确类型
练习:
char s[3][100] = {"hello","world","china"};
用qsort对s进行排序#include <stdlib.h>
练习:
写一个程序 实现加,减,乘,除
以回调函数的形式,打印对应的结果
void processData(int a,int b, int (*pfunc)(int,int))
{
printf();
}命令行 输入
1+2
1-2
1*2
1/2
int a;
int b;
int c;
总结:
1.指针 操作 函数
2.函数名 就是函数的 入口地址
3.定义 :一个函数指针变量 获得 函数名
4.使用 :通过指针变量的方式 进行函数调用
5.用途 :回调
char *strcpy(char *dest,const char *src); // 返回值为 指针类型 ---指针函数
函数指针 -- 函数的指针 --- 函数类型的 指针
指针函数 -- 指针的函数 --- 返回值为指针类型 的函数
三. 指针 + 二维数组
int a[3][4]; //本质还是一维数组
int[4] a[3]; //理解角度
//a --- 数组名 --- a所代表的数组类型 int [3][4]
//a --- 代表的值 --- 数组首元素的地址 --- a[0]
//a[0] 的数据类型 int[4]
//&a[0]---对应的数据类型(理解角度int[4] *) int(*)[4] (语法角度)是一个数组类型 (一维整型数组类型)
//数组类型的指针 --- 数组指针
int (*p)[4] = a;p+1 //偏移到了 下一个 int[4]
//类型为int(*)[4]
*(p+1) //偏移到下一个int
//*(p+1) 代表的类型int[4] 此时相当于是 int[4]的数组名
//*(*(p+1) + 1)*p //三步运算完成后
*p 相当于是 int[4]这种类型 //数组
*p 就相当于 int[4]这个数组的 数组名
int (*p)[4] = a;
p <=> a <=> &a[i]
*(p+i) <=> a[i] <=> &a[i][0] //int[4]这种类型的一维数组的数组名
*(*(p+i) + j) <=> a[i][j]
练习:
定义一个二维整型数组,找出数组最大值
char a[3][4]