day2 内存模型 二级指针
2015-01-22 23:49
393 查看
#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"); }
相关文章推荐
- C——提高(2)字符串一级指针、二级指针内存模型
- 二级指针第三种内存模型的结束标志
- 第三天2017/03/30(下午:二级指针的(输出)内存模型)
- 二级指针输入模型(三种内存模型)
- 二级指针作输入之内存模型一
- 数组指针(二级指针的第二种内存模型)
- C二级指针内存模型一
- 二级指针作输入之内存模型二
- 二级指针做输入_第二种内存模型
- 二级指针的三种内存模型
- 二级指针的三种内存模型
- 二级指针作输入之内存模型三
- C二级指针内存模型二
- 通过字符串逆序学习二级指针的三种内存模型 #################################################### #########################
- C提高_day03_二级指针做输入第2种内存模型
- 二级指针的三种内存模型
- 指针数组(二级指针的第一种内存模型)
- day4_二级指针做输入输出的三种内存模型
- C二级指针内存模型三
- 第三天2017/03/30(上午:二级指针的(输入)内存模型:(共三种模型))