您的位置:首页 > 其它

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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: