二维指针三种内存模型图:






统计字符串两头,非空字符的长度

#include<stdio.h>#include<stdlib.h>#include<string.h>intmain(){//统计字符串两头,非空字符的长度char*p="abc";inti=0;intj=strlen(p)-1;intcount=0;while(isspace(p[i])&&p[i]!='\0'){i++;}while(isspace(p[j])&&p[j]!='\0'){j--;}count=j+1-i;printf("%d\n",count);printf("HelloWorld!\n");system("pause");}/*编译运行:3HelloWorld!请按任意键继续...*/


//函数封装,统计字符串两头,非空字符的长度

#include<stdio.h>#include<stdlib.h>#include<string.h>//函数封装,统计字符串两头,非空字符的长度intgetstrlen(char*str,int*count){if(str==NULL||count==NULL){return-1;}char*p=str;inti=0;intj=strlen(p)-1;while(isspace(p[i])&&p[i]!='\0'){i++;}while(isspace(p[j])&&p[j]!='\0'){j--;}*count=j+1-i;}intmain(){intcount=0;char*s="hello";getstrlen(s,&count);printf("%d\n",count);system("pause");}/*编译运行:5请按任意键继续...*/





【两头堵模型】

昨天的第一题作业--函数封装,去除一个字符串的首尾空格

#include<stdio.h>#include<stdlib.h>#include<string.h>//函数封装,去除一个字符串的首尾空格inttrimSpace(char*str,char*newstr){if(str==NULL||newstr==NULL){return-1;}char*p=str;inti=0;intj=strlen(p)-1;while(isspace(p[i])&&p[i]!='\0'){i++;}while(isspace(p[j])&&p[j]!='\0'){j--;}intcount=j+1-i;strncpy(newstr,str+i,count);newstr[count]='\0';return0;}intmain(){charnewstr[100];char*str="hello";trimSpace(str,newstr);printf("%s",newstr);return0;}/*编译运行:C:\Users\chunli>gccmain.c&ahelloC:\Users\chunli>*/




再次优化,不需要另外使用新的数组

#include<stdio.h>#include<stdlib.h>#include<string.h>//函数封装,去除一个字符串的首尾空格inttrimSpace(char*str){if(str==NULL){return-1;}char*p=str;inti=0;intj=strlen(p)-1;while(isspace(p[i])&&p[i]!='\0'){i++;}while(isspace(p[j])&&p[j]!='\0'){j--;}intcount=j+1-i;strncpy(str,str+i,count);//必须是地址str[count]='\0';return0;}intmain(){charstr[100]="hello";trimSpace(str);//不能使用常量区的内存printf("%s<--end",str);return0;}/*编译运行:C:\Users\chunli>gcc-omyfunmain.c&myfunhello<--endC:\Users\chunli>*/



字符串翻转模型:

1,两头堵模型,字符串翻转:

#include<stdio.h>#include<stdlib.h>#include<string.h>intmain(){intret=0;chars[100]="helloworld!";char*p1=s;char*p2=s+strlen(s)-1;while(p1<p2){*p1=*p1^*p2;*p2=*p1^*p2;*p1=*p1^*p2;p1++;p2--;}printf("%s<--end",s);returnret;}/*编译运行:C:\Users\chunli>gcc-omyfunmain.c&myfun!dlrowolleh<--endC:\Users\chunli>*/




2, 两头堵模型,字符串翻转,函数封装

#include<stdio.h>#include<stdlib.h>#include<string.h>intinverse(char*s){if(s==NULL){return-1;}char*p1=s;char*p2=s+strlen(s)-1;while(p1<p2){*p1=*p1^*p2;*p2=*p1^*p2;*p1=*p1^*p2;p1++;p2--;}}intmain(){intret=0;chars[100]="helloworld!";inverse(s);printf("%s<--end",s);returnret;}/*编译运行:C:\Users\chunli>gcc-omyfunmain.c&myfun!dlrowolleh<--endC:\Users\chunli>*/




3, 字符串翻转,递归---全局变量

#include<stdio.h>#include<stdlib.h>#include<string.h>charg_buf[1024]={0};intinverse(char*s){staticcharbuf[200];inti=0;if(s==NULL)return-1;if(*s=='\0')return0;inverse(s+1);strncat(g_buf,s,1);}intmain(){intret=0;chars[100]="helloworld!";inverse(s);printf("%s\n",g_buf);returnret;}/*编译运行:C:\Users\chunli>gcc-omyfunmain.c&myfun!dlrowolleh*/




4, 字符串翻转,递归---非全局变量

#include<stdio.h>#include<stdlib.h>#include<string.h>intinverse(char*s,char*to){staticcharbuf[200];inti=0;if(s==NULL||to==NULL)return-1;if(*s=='\0')return0;inverse(s+1,to);strncat(to,s,1);}intmain(){charg_buf[1024]={0};intret=0;chars[100]="helloworld!";inverse(s,g_buf);printf("%s\n",g_buf);returnret;}/*编译运行:C:\Users\chunli>gcc-omyfunmain.c&myfun!dlrowolleh*/


函数的集成:

昨天的第三题作业:

#include<stdio.h>#include<stdlib.h>#include<string.h>inttrimSpace(char*str,char*newstr){if(str==NULL||newstr==NULL){return-1;}char*p=str;inti=0;intj=strlen(p)-1;while(isspace(p[i])&&p[i]!='\0'){i++;}while(isspace(p[j])&&p[j]!='\0'){j--;}intcount=j+1-i;strncpy(newstr,str+i,count);newstr[count]='\0';return0;}intget_Valude_By_Key(char*Key_And_Value,char*Key,char*Value){if(Key_And_Value==NULL||Key==NULL||Value==NULL){printf("ERRORFUNget_Valude_By_Key:""Key_And_Value==NULL||Key==NULL||Value==NULL");return-1;}intret=0;char*p=Key_And_Value;p=strstr(p,Key);if(p==NULL){printf("FUNget_Valude_By_Key:strstr(p,Key)==NULL\n");return-1;}p=p+strlen(Key);p=strstr(p,"=");if(p==NULL){printf("FUNget_Valude_By_Key:strstr(p,\"=\")==NULL\n");return-1;}p=p+strlen("=");ret=trimSpace(p,Value);if(ret!=0){printf("FUNget_Valude_By_Key:trimSpace(p,Value)!=0\n");return-2;}return0;}intmain(){intret=0;char*Key_value="id=666=value=hahaha";char*key="id=666";charvalue[100]={0};ret=get_Valude_By_Key(Key_value,key,value);printf("[%s]\n",value);returnret;}/*编译运行:C:\Users\chunli>gccmain.c&a[value=hahaha]*/






C Const 指针 与变量:

#include<stdio.h>#include<stdlib.h>#include<string.h>voidfun1(constchar*p)//指针所指向的内存空间不能修改{printf("%s",p);//指针所指向的内存空间可以读取p=(char*)0x99;//指针的本身的值可以修改//p[1]=1;//指针所指向的内存空间不能修改//*(p+1)=1;//指针所指向的内存空间不能修改}voidfun2(char*constp)//指针的本身的值不可以修改{//p=(char*)0x99;//指针的本身的值不可以修改p[1]='A';//指针所指向的内存空间可以修改*(p+1)='A';//指针所指向的内存空间可以修改printf("%s",p);//指针所指向的内存空间可以读取}voidfun3(constchar*constp)//只能读这个指针{//p=(char*)0x99;//指针的本身的值不可以修改//p[1]='A';//指针所指向的内存空间不可以修改//*(p+1)='A';//指针所指向的内存空间不可以修改printf("%s",p);//指针所指向的内存空间可以读取}intmain(){charp[]="HelloWorld!\n";//定义一个普通指针fun1(p);fun2(p);fun3(p);constinta=10;intconstb=11;//a=11;编译不通过//int*p2=&a;//编译这个不通过//int*p3=&b;//编译这个不通过return0;}/*编译运行:C:\Users\chunli>gccmain.c&aHelloWorld!HAlloWorld!HAlloWorld!*/





指针做输出模型,被调函数分配内存

#include<stdio.h>#include<stdlib.h>#include<string.h>intfun1(char**myp1,int*mylen1,char**myp2,int*mylen2){char*tmp1=NULL;tmp1=(char*)malloc(100);if(tmp1==NULL){printf("ERRORintmp=(char*)malloc(100);\n");return-1;}strcpy(tmp1,"Hello");*mylen1=strlen(tmp1);*myp1=tmp1;char*tmp2=NULL;tmp2=(char*)malloc(100);if(tmp2==NULL){printf("ERRORintmp2=(char*)malloc(100);\n");return-2;}strcpy(tmp2,"World!");*mylen2=strlen(tmp2);*myp2=tmp2;return0;}intmy_free(char**p){if(p==NULL){printf("ERRORinmy_freep==NULL\n");return-1;}//方法1/**p是一级指针的地址**p,*(*p)就是取二级指针所指向的值free(*p);//释放完指针变量所指向的内存空间*p=NULL;//把实参改成NULL*///方法2char*tmp=NULL;tmp=*p;free(tmp);tmp=NULL;}intmain(){intret=0;char*p1=NULL;char*p2=NULL;intlen1=0;intlen2=0;ret=fun1(&p1,&len1,&p2,&len2);if(ret!=0){printf("ERRORinfun1:%d\n",ret);returnret;}printf("[1]%s,%d\n",p1,len1);printf("[2]%s,%d\n",p2,len2);my_free(&p1);//p1所指向的内存释放了,但是p1没有改成NULL,有野指针现象my_free(&p2);return0;}/*编译运行:C:\Users\chunli>gccmain.c&a[1]Hello,6[2]World!,7*/




//二级指针三种模型

// 第一种输入,内存模型

#include<stdio.h>#include<stdlib.h>#include<string.h>//二级指针三种模型//第一种输入,内存模型//遍历二级指针voidprint_arr(char**array,intnum){inti=0;for(i=0;i<num;i++){printf("%s\n",*(array+i));}}//排序voidsort_arr(char**array,intnum){inti=0;intj=0;for(i=0;i<num;i++){for(j=i+1;j<num;j++){if(strcmp(array[i],array[j])<0){char*tmp=array[i];//交换指针array[i]=array[j];array[j]=tmp;}}}}intmain(){inti=0;intj=0;intnum=0;char*array[]={"aaaa","abaaa","ac"};//数组的每一个元素都是一个普通指针num=sizeof(array)/sizeof(array[0]);print_arr(array,num);sort_arr(array,num);printf("------------------------\n");print_arr(array,num);return0;}/*编译运行:C:\Users\chunli>gccmain.c&aaaaaabaaaac------------------------acabaaaaaaa*/




//二级指针三种模型

//第2种内存模型,注意本次指针的步长是30个char

#include<stdio.h>#include<stdlib.h>#include<string.h>//二级指针三种模型//第2种内存模型,注意本次指针的步长是30个charintmain(){charmyBuf[30];chararray[10][30]={"aa","ab","ac"};inti=0;intj=0;intnum=4;for(i=0;i<num;i++){printf("%s\n",array[i]);}for(i=0;i<num;i++){for(j=i+1;j<num;j++){if(strcmp(array[i],array[j])<0){chartmp[30];strcpy(tmp,array[i]);//内存块交换strcpy(array[i],array[j]);strcpy(array[j],tmp);}}}for(i=0;i<num;i++){printf("%s\n",array[i]);}return0;}/*编译运行:C:\Users\chunli>gccmain.c&aaaaaabaaaac------------------------acabaaaaaaa*/



二级指针三种模型--第3种内存模型

#include<stdio.h>#include<stdlib.h>#include<string.h>//二级指针三种模型//第3种内存模型,intmain(){char**p=NULL;intnum=5;inti=0;intj=0;//在堆中申请一片空间,能装num个char类型的指针p=malloc(sizeof(char*)*num);//在这num个指针,每个都指向不同的内存块for(i=0;i<num;i++){p[i]=malloc(sizeof(char)*100);sprintf(p[i],"%d,%d,%d",i,i+10,i*i);}//遍历printf("-----------------------\n");for(i=0;i<num;i++){printf("%s\n",p[i]);}//指针交换for(i=0;i<num;i++){for(j=i+1;j<num;j++){if(strcmp(p[i],p[j])<0){char*tmp=p[i];p[i]=p[j];p[j]=tmp;}}}//遍历printf("-----------------------\n");for(i=0;i<num;i++){printf("%s\n",p[i]);}//内存数据交换for(i=0;i<num;i++){for(j=i+1;j<num;j++){if(strcmp(p[i],p[j])>0){chartmp[100];strcpy(tmp,p[i]);strcpy(p[i],p[j]);strcpy(p[j],tmp);}}}//遍历printf("-----------------------\n");for(i=0;i<num;i++){printf("%s\n",p[i]);}for(i=0;i<num;i++){if(p[i]!=NULL){free(p[i]);p[i]=NULL;}}return0;}/*编译运行:C:\Users\chunli>gccmain.c&a-----------------------0,10,01,11,12,12,43,13,94,14,16-----------------------4,14,163,13,92,12,41,11,10,10,0-----------------------0,10,01,11,12,12,43,13,9*/





//二级指针三种模型

//二维指针输入 输出

//第3种内存模型,堆中开辟,我们自己定义的数组,不需要编译在栈中为我们那样开辟

#include<stdio.h>#include<stdlib.h>#include<string.h>//二级指针三种模型//二维指针输入输出//第3种内存模型,堆中开辟,我们自己定义的数组,不需要编译在栈中为我们那样开辟char**getmem(num){inti=0;char**p=NULL;//在堆中申请一片空间,能装num个char*类型的指针p=(char**)malloc(sizeof(char*)*num);if(p==NULL){returnNULL;}//在这num个指针,每个都指向不同的内存块for(i=0;i<num;i++){p[i]=malloc(sizeof(char)*100);sprintf(p[i],"%d,%d,%d",i,i+10,i*i);}returnp;}voidprint_arr(char**p,intnum){inti=0;for(i=0;i<num;i++){printf("%s\n",p[i]);}}voidsort_arr1(char**p,intnum){inti=0;intj=0;//指针交换for(i=0;i<num;i++){for(j=i+1;j<num;j++){if(strcmp(p[i],p[j])<0){char*tmp=p[i];p[i]=p[j];p[j]=tmp;}}}}voidsort_arr2(char**p,intnum){inti=0;intj=0;//内存数据交换for(i=0;i<num;i++){for(j=i+1;j<num;j++){if(strcmp(p[i],p[j])>0){chartmp[100];strcpy(tmp,p[i]);strcpy(p[i],p[j]);strcpy(p[j],tmp);}}}}voidfree_arr(char**p,intnum){inti=0;for(i=0;i<num;i++){if(p[i]!=NULL){free(p[i]);p[i]=NULL;}}}intmain(){char**p=NULL;intnum=5;inti=0;intj=0;p=getmem(num);printf("--------\n");print_arr(p,num);sort_arr1(p,num);printf("--------\n");print_arr(p,num);sort_arr2(p,num);printf("--------\n");print_arr(p,num);free_arr(p,num);if(p!=NULL){free(p);p=NULL;}return0;}/*编译运行:C:\Users\chunli>gccmain.c&a--------0,10,01,11,12,12,43,13,94,14,16--------4,14,163,13,92,12,41,11,10,10,0--------0,10,01,11,12,12,43,13,94,14,16*/



//玩转多级指针

//玩转多级指针#include<stdio.h>#include<stdlib.h>#include<string.h>//玩转多级指针intgetmem(char***p,intnum){inti=0;if(p==NULL)//里面应该是实参的取地址{return-1;}char**tmp=(char**)malloc(sizeof(char*)*num);if(tmp==NULL){return-1;}for(i=0;i<num;i++){tmp[i]=malloc(sizeof(char)*100);sprintf(tmp[i],"%d->%d->%d",i,i+10,i*i);}*p=tmp;}intfreemem(char***p,intnum){if(p==NULL){return-1;}char**tmp=NULL;tmp=*p;inti;for(i=0;i<num;i++){if(tmp[i]!=NULL){free(tmp[i]);tmp[i]=NULL;}}free(tmp);*p=NULL;}intprint_arr(char***p,intnum){if(p==NULL){printf("2Hello\n");return-1;}inti;for(i=0;i<num;i++){printf("%s\n",*(*(p)+i));}}intmain(){char**p=NULL;intnum=5;getmem(&p,num);print_arr(&p,num);freemem(&p,num);return0;}/*编译运行:C:\Users\chunli>gccmain.c&a0->10->01->11->12->12->43->13->94->14->16*/




作业题: