学习日志以及个人总结(14)

本文介绍了C语言中的基本指针操作函数如strcpy、strcat、strcmp等,以及回调函数的使用,以qsort为例展示回调功能,并提供了一个加减乘除的回调程序示例。同时,对二维数组的概念和指针操作进行了详细解释。
摘要由CSDN通过智能技术生成

    gets puts strlen 
    strcmp/strcnmp
    strcat/strncat
    strcmp/strncmp

strlen

   int Str_len(char *s)
   {
       char *i =s;                                                   
       while(*s != '\0')
       {
           ++s;
       }
      return s-i;
  }

strcmp

  int Str_cmp(char *s1,char *s2)
 {
      int ret =0;
     while(*s1==*s2)
      {
          ++s1;++s2;
          if(*s1==0 && *s2 ==0)
          {
             break;
          }
      }
          ret= *s1-*s2;

strncmp

 53 int Strncmp(const char *s1,const char *s2,int n)
 54 {
 55     while(n--&& (*s1==*s2))
 56     {
 57         if(n==0)
 58         {
 59             return 0;
 60         }
 61         s1++;s2++;
 62     }
 63     return *s1-*s2;
 64 }

strcpy

 94 char *Str_cpy(char *s1,char *s2)
 95 {
 96     while(*s1 = *s2)
 97     {
 98         s1++;
 99         s2++;
100     }
101     return s1;                                              
102 }

strncpy

 80 char *Strncpy(char *s1,const char *s2,int n)
 81 {
 82     while(n &&(*s1 = *s2))
 83     {
 84         s1++;s2++;
 85         --n;
 86     }   
 87         while(n)
 88     {
 89         --n;
 90         *s1++ = '\0'; 
 91     }   
 92     return s1;
 93 }

strcat

 41 char* Str_cat(char *s1,const char *s2)
 42 {
 43     while(*s1 != '\0')
 44     {
 45         ++s1;
 46     }
 47     while(*s1=*s2)
 48     {
 49         ++s1;                                               
 50         ++s2;
 51     }
 52 }

strncat

 25 char *Strncat(char *s1,const char *s2,int n)
 26 {
 27     while(*s1 !='\0')
 28     {
 29         ++s1;
 30     }
 31     while(n&&*s2 !='\0')
 32     {
 33         *s1=*s2;
 34         s1++;
 35         s2++;
 36         --n;
 37     }
 38     *s1 ='\0';
 39 }

指针 +函数

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 返回值 表示的就是数组中两个元素的大小关系 
  
void *  //万能指针  --可以接收任意类型的指针 
        //void类型 
        //
        
        注意: 
         如果通过该类型的地址进行数据访问
         一定要转换为 明确类型 

小结:


1.指针 操作 函数 
2.函数名 就是函数的入口地址 
3.定义一个 函数指针变量 获得 函数名 
4.使用 
  通过指针变量的方式 进行函数调用 
5.用途 
  回调 

some 练习

qsort的实现(回调函数)

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<string.h>
  4 int compar(const void *a,const void *b)
  5 {
  6     return strcmp((const char *)a , (const char *)b);       
  7 }
  8 
  9 int main(void)
 10 {
 11     char s[3][100]={"hello","world","china"};
 12     int len=sizeof(s)/sizeof(s[0]);
 13     qsort(s,len,sizeof(s[0]),compar);
 14     for(int i=0;i<len;i++)
 15     {
 16         printf("%s\n",s[i]);
 17     }
 18     return 0;
 19 }
~      

写一个程序 实现加,减,乘,除
以回调函数的形式,打印对应的结果 

1 #include<stdio.h>                                                                                                                                                                                       
  2 #include<stdlib.h>
  3 int add(int a,int b)
  4 {
  5     return a+b;
  6 }
  7 int sub(int a,int b)
  8 {
  9     return a-b;
 10 }
 11 int mul(int a,int b)
 12 {
 13     return a*b;
 14 }
 15 int ww(int a,int b)
 16 {
 17     return a/b;
 18 }
 19 
 20 void processData(int a,int b, int(*pfunc)(int,int))
 21 {
 22     printf("result:%d\n",pfunc(a,b));
 23 }
 24 
 25 int main(void)
 26 {
 27     int a=0;int b=0;
 28     char c;
 29     printf("input a num:");
 30     scanf("%d%c%d",&a,&c,&b);
 31     switch(c)
 32     {
 33     case'+':
 34         processData(a,b,add);
 35         break;
 36     case'-':
 37         processData(a,b,sub);
 38         break;
 39     case'*':
 40         processData(a,b,mul);
 41         break;
 42     case'/':
 43         processData(a,b,ww);
 44         break;
 45     }
 46     return 0;
 47 }                  

指针+二维数组


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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值