二级指针的3种内存模型
来源:互联网 发布:c语言教材 谭浩强 pdf 编辑:程序博客网 时间:2024/04/30 10:01
1.二级指针第一种内存模型
#include<stdio.h>#include<stdlib.h>#include <string.h>#include <ctype.h>int sort_arr(char**myArr,int num){char*temp;char **p = myArr;int i,j;for (i=0;i<num;i++){for (j=i+1;j<num;j++){if (strcmp(p[i],p[j])>0){temp = p[i];//主意我们交换的只是指针的值,改变指针的指向p[i] = p[j];p[j] = temp;}}}return 0;}int print_arr(char**myArr,int num){int i = 0;for (i=0;i<num;i++){printf("num:%s\n",*(myArr+i));}return 0;}int main(){//数组 数组中的每一个元素是指针,指针数组//1.排序 2.指针做函数参数 3.内存int num,i,j;char*temp;char* myArr[4]={"ddd","cccc","bbbb","aaaaaaa"};print_arr(myArr,4);sort_arr(myArr,4);printf("----------\n");print_arr(myArr,4);system("pause");return 0;}
2.二级指针第二种内存模型
#include<stdio.h>#include<stdlib.h>#include <string.h>#include <ctype.h>int sort_arr(char myArr[10][20],int num){char temBuf[20];//char **p = myArr;int i,j;for (i=0;i<num;i++){for (j=i+1;j<num;j++){if (strcmp(myArr[i],myArr[j])>0){strcpy(temBuf , myArr[i]);//把数据交换 内存块strcpy(myArr[i] , myArr[j]);strcpy(myArr[j] , temBuf);}}}return 0;}/*//第一种内存模型打印函数不适用第二种内存模型//原因:二级指针做输入_第一种内存模型 myArr + 1 与第二种内存模型 myArr + 1 //指针步长不一样哈 指针所指向内存空间的数据不一样int print_arr(char**myArr,int num){int i = 0;for (i=0;i<num;i++){printf("num:%s\n",*(myArr+i));}return 0;}*/int print_arr(char myArr[10][20],int num){int i = 0;for (i=0;i<num;i++){printf("num:%s\n",*(myArr+i));}return 0;}int main(){//数组 数组中的每一个元素是指针,指针数组//1.排序 2.指针做函数参数 3.内存char temBuf[30];char myArr[10][20]={"ff","bbbbb","ddddd","ccccc","eeeee"};int num = 5;print_arr(myArr,num);sort_arr(myArr,num);printf("---------\n");print_arr(myArr,num);system("pause");return 0;}
3.二级指针第三种内存模型
#include<stdio.h>#include<stdlib.h>#include <string.h>#include <ctype.h>//在堆上分配内存空间 通过return返回char** getMen(int num){ char **p = NULL; int i,j; p = (char **)malloc(sizeof(char*)*num); for (i =0;i<num;i++) { p[i] = (char*)malloc(sizeof(char)*100); sprintf(p[i],"%d%d%d",9-i,9-i,9-i);//向内存空间写入数据 } return p;}//在堆上分配内存空间,通过函数参数返回int getMen2(char ***p,int num){ char **tmp = NULL; int i,j; tmp = (char **)malloc(sizeof(char*)*num); if (p==NULL) { return -1; } for (i =0;i<num;i++) { tmp[i] = (char*)malloc(sizeof(char)*100); sprintf(tmp[i],"%d%d%d",9-i,9-i,9-i);//向内存空间写入数据 } *p = tmp;// int a ; int *p ; p = &a; *p=10 ;通过三级指针修改二级指针的值 return 0;}//释放内存空间int freeMen(char**p,int num){ int ret =0,i; for (i =0;i<num;i++) { if (p[i]!=NULL) { free(p[i]); p[i]=NULL; } } if (p!=NULL) { free(p); p=NULL; } return ret;}//打印int print_arr(char**myArr,int num){ int i = 0; for (i=0;i<num;i++) { printf("num:%s\n",*(myArr+i)); } return 0;}//排序 只交换指针int sort_arr(char**myArr,int num){ char*temp; char **p = myArr; int i,j; for (i=0;i<num;i++) { for (j=i+1;j<num;j++) { if (strcmp(p[i],p[j])>0) { temp = p[i];//主意我们交换的只是指针的值,改变指针的指向 p[i] = p[j]; p[j] = temp; } } } return 0;}//排序2 交换数据int sort_arr2(char**myArr,int num){ char temBuf[20]; char **p = myArr; int i,j; for (i=0;i<num;i++) { for (j=i+1;j<num;j++) { if (strcmp(p[i],p[j])>0) { strcpy(temBuf,p[i]);//交换数据 strcpy(p[i] , p[j]); strcpy(p[j] , temBuf); } } } return 0;}int main(){ //1.排序 2.指针做函数参数 3.内存 char **p = NULL; //p = getMen(5); getMen2(&p,5); //排序前打印 print_arr(p,5); //排序 sort_arr2(p,5); //排序后打印 print_arr(p,5); //释放内存 freeMen(p,5); p=NULL; system("pause"); return 0;}
4.二级指针三种内存模型图:
5.二级指针强化练习(两个辅助指针变量挖字符串)
1)使用第二种内存模型 主调函数分配内存
#include<stdio.h>#include<stdlib.h>#include <string.h>#include <ctype.h>/*函数功能 根据字符c来分割字符串str*/int splitStr(const char *str,char c ,char buf[10][20],int *num){char* p = NULL,*pTmp = NULL;//两个辅助指针变量int tmpcount = 0,len;p = str;pTmp = str;do {p = strchr(p,c);if (p!=NULL){if (p-pTmp>0){strncpy(buf[tmpcount],pTmp,p-pTmp);buf[tmpcount][p-pTmp] = '\0';//printf("%s\n",buf[tmpcount]);tmpcount++;pTmp = p = p+1;len = strlen(p);//用来保存最后一个字符串的长度}}else{//拷贝最后一个分割的字符串包括\0strncpy(buf[tmpcount],pTmp,len+1);break;}} while (*p!='\0');*num=tmpcount+1;return 0;}/*函数功能 打印二维数组*/void printArr(char a[10][20],int n){int i;for (i=0;i<n;i++){printf("%s\n",*(a+i));}}int main(){char *input="abcdefg,hjkln,sssss,kkk,hhh,j";char ctemp = ',';char myArr[10][20]={0};char *tmp;int ret;int n,i;ret = splitStr(input,ctemp,myArr,&n);if (ret!=0){printf("error\n");}printArr(myArr,n);system("pause");return 0;}
2)使用第三种内存模型 主调函数分配内存
#include<stdio.h>#include<stdlib.h>#include <string.h>#include <ctype.h>/*第三种内存模型*/int splitStr(const char *str,char c,char **buf,int *count){char* p = NULL,*pTmp = NULL;//两个辅助指针变量int tmpcount = 0,len;p = str;pTmp = str;do {p = strchr(p,c);if (p!=NULL){if (p-pTmp>0){strncpy(buf[tmpcount],pTmp,p-pTmp);buf[tmpcount][p-pTmp] = '\0';//printf("%s\n",buf[tmpcount]);tmpcount++;pTmp = p = p+1;len = strlen(p);//用来保存最后一个字符串的长度}}else{//拷贝最后一个分割的字符串包括\0strncpy(buf[tmpcount],pTmp,len+1);break;}} while (*p!='\0');*count=tmpcount+1;return 0;}int main(){char *input="abcdefg,hjkln,sssss,kkk,hhh,j";char ctemp = ',';char **p = NULL;int ret;int n,i;p=(char**)malloc(10*sizeof(char*));if (p==NULL){return;}for (i=0;i<10;i++){p[i] = (char *)malloc(20*sizeof(char));}ret = splitStr(input,ctemp,p,&n);if (ret!=0){printf("error\n");}for (i=0;i<n;i++){printf("%s\n",*(p+i));} //释放内存system("pause");return 0;}
3)使用第三种内存模型 被调函数分配内存 通过return返回
#include<stdio.h>#include<stdlib.h>#include <string.h>#include <ctype.h>/*第三种内存模型 被调函数分配内存 通过return返回*/char** splitStr2(char *str,char c,int *count){char* p = NULL,*pTmp = NULL;//两个辅助指针变量int tmpcount = 0,len,len2;char**buf;p = str;pTmp = str;//第一遍扫描 开辟第一维空间do {p = strchr(p,c);if (p!=NULL){if (p-pTmp>0){tmpcount++;pTmp = p = p+1;}}else{break;}} while (*p!='\0');*count=tmpcount+1;buf = (char**)malloc((tmpcount+1)*sizeof(char*));//printf("tmpcount:%d\n",tmpcount);if(buf==NULL){return NULL;}//第二遍扫描 根据分割的字符串的长度,开辟第二维空间并拷贝字符串tmpcount = 0;p = str;pTmp = str;do {p = strchr(p,c);if (p!=NULL){if (p-pTmp>0){len = p-pTmp+1;buf[tmpcount] = (char*)malloc(len*sizeof(char));if (buf[tmpcount] == NULL){free(buf);return ;}strncpy(buf[tmpcount],pTmp,p-pTmp);buf[tmpcount][p-pTmp] = '\0';tmpcount++;pTmp = p = p+1;len2 = strlen(p);//用来保存最后一个字符串的长度}}else{//printf("tmpcount:%d\n",tmpcount);//printf("len2:%d\n",len2);buf[tmpcount] = (char*)malloc((len2+1)*sizeof(char));if (buf[tmpcount] == NULL){free(buf);return ;}//拷贝最后一个分割的字符串包括\0strncpy(buf[tmpcount],pTmp,len2+1);break;}} while (*p!='\0');return buf;}int main(){char *input="abcdefg,hjkln,sssss,kkk,hhh,j";char ctemp = ',';char **p = NULL;int ret;int n,i;p = splitStr2(input,ctemp,&n);printf("n:%d\n",n);for (i=0;i<n;i++){printf("%s\n",*(p+i));} //释放内存空间 system("pause");return 0;}
4)使用第三种内存模型 被调函数分配内存 通过函数参数返回
<pre name="code" class="cpp">#include<stdio.h>#include<stdlib.h>#include <string.h>#include <ctype.h>/*第三种内存模型 被调函数分配内存 通过tmpbuf返回*/ int splitStr3(char *str,char c,char*** tmpbuf,int *count){ char* p = NULL,*pTmp = NULL;//两个辅助指针变量 int tmpcount = 0,len,len2; char**buf; p = str; pTmp = str; //第一遍扫描 开辟第一维空间 do { p = strchr(p,c); if (p!=NULL) { if (p-pTmp>0) { tmpcount++; pTmp = p = p+1; } } else { break; } } while (*p!='\0'); *count=tmpcount+1; buf = (char**)malloc((tmpcount+1)*sizeof(char*)); //printf("tmpcount:%d\n",tmpcount); if(buf==NULL) { return -1; } //第二遍扫描 根据分割的字符串的长度,开辟第二维空间并拷贝字符串 tmpcount = 0; p = str; pTmp = str; do { p = strchr(p,c); if (p!=NULL) { if (p-pTmp>0) { len = p-pTmp+1; buf[tmpcount] = (char*)malloc(len*sizeof(char)); if (buf[tmpcount] == NULL) { free(buf); return -2; } strncpy(buf[tmpcount],pTmp,p-pTmp); buf[tmpcount][p-pTmp] = '\0'; tmpcount++; pTmp = p = p+1; len2 = strlen(p);//用来保存最后一个字符串的长度 } } else { //printf("tmpcount:%d\n",tmpcount); //printf("len2:%d\n",len2); buf[tmpcount] = (char*)malloc((len2+1)*sizeof(char)); if (buf[tmpcount] == NULL) { free(buf); return -2; } //拷贝最后一个分割的字符串包括\0 strncpy(buf[tmpcount],pTmp,len2+1); break; } } while (*p!='\0'); *tmpbuf = buf; return 0;} //释放内存空间 void freeMem(char**p,int count) { int i =0; if (p == NULL) { return ; } for (i=0;i<count;i++) { if (p[i]!=NULL) { free(p[i]); } } if (p!=NULL) { free(p); } }int main(){ char *input="abcdefg,hjkln,sssss,kkk,hhh,j"; char ctemp = ','; char **p = NULL; int ret; int n,i; ret = splitStr3(input,ctemp,&p,&n); if (ret!= 0) { printf("error"); return -1; } //printf("n:%d\n",n); for (i=0;i<n;i++) { printf("%s\n",*(p+i)); } //释放内存 freeMem(p,n); system("pause"); return 0;}
0 0
- 二级指针的3种内存模型
- 二级指针的3种内存模型
- 二级指针的第三种内存模型
- 二级指针的三种内存模型
- 二级指针的三种内存模型
- 二级指针的三种内存模型
- 二级指针的三种内存模型
- 二级指针的内存模型
- 数组指针(二级指针的第二种内存模型)
- 二级指针内存模型
- 二级指针内存模型
- 二维数组(二级指针的第二种内存模型)
- C语言中,二级指针的三种内存模型
- C语言中的二级指针的三种内存模型
- day4_二级指针做输入输出的三种内存模型
- 二级指针(作为输入)的3中内存模型
- day4_二级指针的内存模型
- 二级指针第三种内存模型
- 【Java】核心技术点之【注解】
- 欢迎使用CSDN-markdown编辑器
- 用Java语言编写一个"答答租车系统"
- 关于如何在web.xml中配置spring
- Unity3D工具类 - 鼠标单击/双击
- 二级指针的3种内存模型
- 5分种让你了解javascript异步编程的前世今生,从onclick到await/async
- Spring中的ContextLoaderListener使用
- Android Installation error: INSTALL_FAILED_VERSION_DOWNGRADE
- 网站新手引导tips提示功能开发经验分享
- kindeditor-4 img 绝对路径问题
- A Simple Web App with Spring Boot, Spring Security and Stormpath – in 15 Minutes
- OpenGL ES教程
- 苹果开发者账号注册申请流程