day2 内存模型 二级指针

#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");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值