day2 内存模型 二级指针

来源:互联网 发布:朝鲜洲际导弹 知乎 编辑:程序博客网 时间:2024/06/07 15:48
#include <stdio.h>#include <stdlib.h>#include <string.h>//二级指针第一种内存模型void main01(){char * ArrayStr[]={"cc","aa","bb","111"};char *tmp=NULL;int i=0;int j=0;for(i=0;i<4;i++){printf("%s \n",ArrayStr[i]);}for(i=0;i<4;i++){   for(j=i+1;j<4;j++)   {   if(strcmp(ArrayStr[i],ArrayStr[j])>0)   {   tmp=ArrayStr[i];   ArrayStr[i]=ArrayStr[j];   ArrayStr[j]=tmp;   }   }}printf("=====\n");for(i=0;i<4;i++){printf("%s \n",ArrayStr[i]);}}int printfArr(char ** ArrayStr,int iNum){int i=0;for(i=0;i<4;i++){printf("%s \n",ArrayStr[i]);}}int sortArrayStr(char ** ArrayStr,int iNum){char *tmp=NULL;int i=0;int j=0;for(i=0;i<4;i++){   for(j=i+1;j<4;j++)   {   if(strcmp(ArrayStr[i],ArrayStr[j])>0)   {   //char * ArrayStr[]={"cc","aa","bb","111"};   //是常量区?就是说不可通过指针修改?   //修改的是数组元素(只不过这个数组元素比较特殊一点而已)   //数组元素比是一个指针变量 指针变量和它所指向的内存空间是两个不同的概念   tmp=ArrayStr[i];   ArrayStr[i]=ArrayStr[j];   ArrayStr[j]=tmp;   }   }}}void main(){ //它是一个数组,里面装的是地址而已。指针数组//指针数组做函数参数 char * ArrayStr[]={"cc","aa","bb","111"};int i=0;int j=0;//排序之前printf("排序之前\n");     printfArr(ArrayStr,4);sortArrayStr(ArrayStr,4);printf("=====\n");printfArr(ArrayStr,4);}


以上是第一种内存模型

第二种内存模型

#include <stdio.h>#include <stdlib.h>#include <string.h>#define _CRT_SECURE_NO_WARNINGS//指针类型不一样.  内存模型不一样//没有内存那来的指针 int printfArr2(char ** ArrayStr,int iNum){int i=0;for(i=0;i<iNum;i++){printf("%s \n",ArrayStr[i]);}return 0;}//打印int printfArr3(char mArray[10][30],int iNum){int i=0;for(i=0;i<iNum;i++){printf("%s \n",mArray[i]);}return 0;}int sortArr3(char mArray[10][30],int iNum){int i=0;int j=0;char buf[30];//buf数组名代表数组首元素地址//排序for(i=0;i<4;i++){   for(j=i+1;j<4;j++)   {   if(strcmp(mArray[i],mArray[j])>0)   {   // strcpy_s(buf,mArray[i]);   strcpy(buf,mArray[i]);   strcpy(mArray[i],mArray[j]);   strcpy(mArray[j],buf);   }   }}return 0;}void main(){char mArray[10][30]={"ccc","aaa","bbb","111"};//二维mArray 数组名代表什么?//跟第一种方式分配的内存不一样  char * ArrayStr[]={"cc","aa","bb","111"};printfArr3(mArray,4);//排序sortArr3(mArray,4);printf("==========\n");printfArr3(mArray,4);}

第三种内存模型

#include <stdio.h>#include <stdlib.h>#include <string.h>int printfArr1(char ** ArrayStr,int iNum){int i=0;for(i=0;i<10;i++){printf("%s \n",ArrayStr[i]);}return 0;}int sortArrayStr(char ** ArrayStr,int iNum){char *tmp=NULL;int i=0;int j=0;for(i=0;i<iNum;i++){   for(j=i+1;j<iNum;j++)   {   if(strcmp(ArrayStr[i],ArrayStr[j])>0)   {   //char * ArrayStr[]={"cc","aa","bb","111"};   //是常量区?就是说不可通过指针修改?   //修改的是数组元素(只不过这个数组元素比较特殊一点而已)   //数组元素比是一个指针变量 指针变量和它所指向的内存空间是两个不同的概念   tmp=ArrayStr[i];   ArrayStr[i]=ArrayStr[j];   ArrayStr[j]=tmp;   }   }}return 0;}void  main(){//怎么理解(多级)指针做函数参数//理解角度从两个角度出发//第一角度,站在c/c++ 编译器的角度 对形参,如果是指针类型,c编译器只会分把他当作一个指针变量来看。分配四个字节的内存//第二角度,我们只有在使用指针所指向的内存空间的时候,才会去关心内存是一维的还是二维的。int i=0;int j=0;char buf[100];char **myarray= (char**)malloc(10*sizeof(char*));if(myarray==NULL){ return ;}for(i=0;i<10;i++){myarray[i]=(char*)malloc(100*sizeof(char));if(myarray[i]==NULL){     return ;}sprintf(myarray[i],"%d%d%d",i,i,i);}printf("========");//第三种内存模型打印printf("排序之前\n");printfArr1(myarray,10);/*for(i=0;i<10;i++){printf("%s \n",myarray[i]);}*///排序sortArrayStr(myarray,10);printf("排序之后\n");for(i=0;i<10;i++){printf("%s \n",myarray[i]);}for(i=0;i<10;i++){free(myarray[i]);}if(myarray!=NULL){free(myarray);}system("pause");}

两个辅助指针挖字符串

#include "stdio.h"#include "stdlib.h"#include "string.h"/*有一个字符串符合以下特征(”abcdef,acccd,eeee,aaaa,e3eeeee,sssss,";),要求写一个函数(接口),输出以下结果1)以逗号分割字符串,形成二维数组,并把结果传出;2)把二维数组行数运算结果也传出。strchr(“aa,aa”,’,’ );请自己定义一个接口(函数)。要求1:能正确表达功能的要求,定义出接口(函数)(30分);要求2:正确实现接口(函数),并实现功能(40分);要求3:编写正确的测试用例。(30分)。*///1p 和 pTmp 初始化 ,都指向地址//2执行strstr strchr()// 如果找到,那么p 会跳到,第一次出现的位置p  pTmp 直接正好形成一个差值//3,再次让p和pTmp 都达到检索条件的开始位置int spitString(char *buf1, const char c, char buf[10][30], int *mycount){char *p = NULL;int count = 0;int tmpcount = 0;char *pTmp = NULL;pTmp = buf1;p = buf1;do {p = strchr(p, c);if (p!= NULL) //如果找到{tmpcount = p - pTmp;memcpy(buf[count], pTmp , tmpcount);buf[count][tmpcount] = '\0';//printf("%s \n", buf2);pTmp = p = p + 1;count++;}else{break;}} while (*p != '\0');//多少行*mycount = count;}void main(){int i=0;char *p = "aaaaa,bbbb,cccc,dddd,eeee,fff,";char c = ',';char buf[10][30];int ncount;    spitString(p, c, buf, &ncount);for (i=0; i<ncount; i++){printf("%s\n", buf[i]);}system("pause");}


0 0
原创粉丝点击