指针和数组的区别
指针:动态分配(本质区别)、间接访问数据效率低,会导致内存的泄漏,偏向地址处理、分配空间可能不连续
数组:静态分配、直接访问数据效率高、易导致数组越界、偏向值的处理、分配空间连续
内存分配:从全局数据区域分配,在栈上创建,在堆上创建
内存错误和对策:①内存分配未成功,却使用了它 ②内存分配虽然成功,但是尚未初始化就引用它 ③内存分配成功并且已经初始化,但操作越过了内存的边界 ④忘记了释放内存,造成内存泄漏 ⑤释放了内存却继续使用它
函数
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 }
指针:动态分配(本质区别)、间接访问数据效率低,会导致内存的泄漏,偏向地址处理、分配空间可能不连续
数组:静态分配、直接访问数据效率高、易导致数组越界、偏向值的处理、分配空间连续
内存分配:从全局数据区域分配,在栈上创建,在堆上创建
内存错误和对策:①内存分配未成功,却使用了它 ②内存分配虽然成功,但是尚未初始化就引用它 ③内存分配成功并且已经初始化,但操作越过了内存的边界 ④忘记了释放内存,造成内存泄漏 ⑤释放了内存却继续使用它
函数
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 }