嵌入式学习 Day14

一. 三个函数

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

练习:

写一个程序 实现加,减,乘,除
以回调函数的形式,打印对应的结果 
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;

嵌入式学习 Day14_第1张图片

总结:
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] (语法角度)是一个数组类型 (一维整型数组类型)
                  //数组类型的指针 --- 数组指针                   
   

嵌入式学习 Day14_第2张图片       
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] 

嵌入式学习 Day14_第3张图片

你可能感兴趣的:(学习,算法,数据结构)