函数、数组区别以及函数注意点和回调函数,以及删除字符串中出现次数最少的字符的程序

指针和数组的区别
指针:动态分配(本质区别)、间接访问数据效率低,会导致内存的泄漏,偏向地址处理、分配空间可能不连续
数组:静态分配、直接访问数据效率高、易导致数组越界、偏向值的处理、分配空间连续


内存分配:从全局数据区域分配,在栈上创建,在堆上创建
内存错误和对策:①内存分配未成功,却使用了它  ②内存分配虽然成功,但是尚未初始化就引用它  ③内存分配成功并且已经初始化,但操作越过了内存的边界  ④忘记了释放内存,造成内存泄漏  ⑤释放了内存却继续使用它


函数
1、函数的好处:①提高了代码的复用性 ②提高了代码的维护性 ③迭代开发(可扩展性开发)
2、函数的三要素:函数名(带有自注释性,可读性,函数名也是指针常量,保存的是函数存放的地址(也称为函数入口地址)),函数形参,返回值
3、函数调用的步骤:①通过函数名找到函数的入口地址  ②给形参分配空间  ③传值:把实参变量对应空间的值传给形参  ④执行函数体里的语句  ⑤函数返回并释放内存空间
4、读(不修改)实参变量对应内存空间的值时,传实参变量名
      写(修改)实参变量对应内存空间的值时,传实参变量名的地址
5、如何定义多个返回值?————用传出参数
6、return不能返回局部变量的地址
7、exit(1)用于结束整个程序,头文件#include<stdio.h>,其中“1”表示退出后返回的值
8、echo相当于printf, echo $?:当前这个程序执行的返回值
9、如何提高函数的编码质量?
答:在做函数的调用的时候,要注意错误返回值的判断,防止将函数的参数作为工作变量;检查函数所有参数输入的有效性,注意入口参数的检查
10、回调函数:一个通过函数指针调用的函数,如果你把函数指针(函数的入口地址)传递给另一个函数,这个函数指针被用来调用它所指向的函数时,我们就说这个函数是回调函数
  1 #include<stdio.h>
  2 int add (int a,int b)
  3 {
  4     return a+b;
  5 }
  6 int cal(int(*p_func)(int,int),int a,int b)
  7 {
  8     return p_func(a,b);
  9 }
 10 int main()
 11 {
 12     int a=5;
 13     int b=6;
 14     int (*p_func)(int ,int );
 15     p_func=add;
 16     int result=cal(add,a,b);
 17     
 18     printf("result is %d\n",result);
 19    }
11、主函数参数也叫做命令行参数
  1 #include<stdio.h>
  2 
  3 int main(int argc,char *argv[])
  4 {
  5     if(argc==2)
  6     {
  7         printf("this is error!");
  8     }
  9     int i;
 10     printf("%d\n",argc);
 11     for(i=0;i<argc;i++)
 12     {
 13         printf("argv[%d]=%d\n",i,atoi(argv[i]));
 14     }
 15 }


找出字符串中出现次数最少的字符并删除的程序:
main函数:
  1 #include<stdio.h>
  2 #define MAX_SIZE 1024
  3 
  4 int main()
  5 {
  6     char src[MAX_SIZE];
  7     printf("please input string:");
  8     scanf("%s",src);
  9     int count[26]={0};
 10     get_count(src,count);
 11     int min_count=get_min_count(count);
 12     del_ch_min_count(src,min_count,count);
 13     printf("result is:%s\n",src);
 14     return 0;
 15 }
计数函数:
  1 #include<stdio.h>
  2 
  3 void get_count(char *src,int *count)
  4 {
  5     if(src==NULL||count==NULL)
  6     {
  7         printf("the program is error!");
  8         exit(1);
  9     }
 10     while(src!='\0')
 11     {
 12         count[*src-'a']++;
 13         src++;
 14     }
 15 }
找出最小最小数:
  1 int get_min_count(int *count)
  2 {
  3     int i;
  4     int min;
  5     for(i=0;i<26;i++)
  6     {
  7         if(count[0]!=0)
  8         {
  9             min=count[i];
 10             break;
 11         }
 12     }
 13     for(;i<26;i++)
 14     {
 15         if(count[i]<min&&count[i]!=0)
 16         {
 17             min=count[i];
 18         }
 19     }
 20     return min;
 21 }
删除出现次数最少的字符:
  1 int del_ch_min_count(char *src,int min,int *count)
  2 {
  3     int i;
  4     while(*src!='0')
  5     {
  6         if(count[*src-'a']==min)
  7         {
  8             for(i=0;i<strlen(src);i++)
  9             {
 10                 *(src+i)=*(src+i+1);
 11                 *(src+strlen(src))='\0';
 12             }
 13         }
 14         else
 15         {
 16             src++;
 17         }
 18     }
 19 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值