栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

3.2 二级指针

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

3.2 二级指针

3.1 指针的输入输出模型

        指针做输入:主调函数分配内存

        指针做输出:被调函数分配内存

3.2 二级指针做输入的第一种内存模型

·        1.指针数组:数组中的每一个元素都是一个指针

                   形如:char *myArray[] = {"aaa",bbb","ccc","ddd"};

                  内存模型:

 

                注:1)myArray代表 数组myArray的首地址;

                        2)*myArray等价于myArray[0],若以%s的形式输出,则输出myArray[0]中保存的地址中所存储的元素,即打印“aaa”。若以%d的形式输入,则打印的是0x2233即myArray[0]中保存的地址。

                       3) *(myArray+1)等价于myArray[1] ;

        2.定义函数实现{ "xxxx","bbbb","gggg","dddd" }的排序操作

int sortArray(char **initArray,int num)
{
	int ret = 0;
	int i, j;
	char* temp=NULL;
	if (*initArray == NULL)
	{
		ret = -1;
		return ret;
	}

	//排序
	for (i = 0; i < num; i++)
	{
		for (j = i + 1; j < num; j++)
		{
			if (strcmp(initArray[i], initArray[j]) > 0)//比较内存指向的数据
			{
                //交换数组中保存的内存地址,相当于改变指针的指向
				temp = initArray[i];
				initArray[i] = initArray[j];
				initArray[j] = temp;
			}
		}
	}
	return ret;
}
void printArray(char** initArray,int num)
{

	int i, j;
	for (i = 0; i < num; i++)
	{
		printf("%sn", initArray[i]);
	}
}
void main()
{
	//数组   数组中的每一个元素是指针   指针数组

	int ret = 0;
	char* myArray[] = { "xxxx","bbbb","gggg","dddd" };
	int num = sizeof(myArray) / sizeof(myArray[0]);
	//打印


	printf("排序前:n");
	printArray(myArray, num);
	//排序
	ret = sortArray(myArray, num);

	printf("排序后:n");
	printArray(myArray,num);
	system("pause");
	return;
}

        内存模型示例:

         

3.3 指针做函数参数的第二种内存模型

1.内存模型的实例图

        

 

2.定义函数实现{ "xxxx","bbbb","gggg","dddd" }的排序操作

int sortArray1(char initArray[10][30], int num)
{
	int ret = 0;
	char tempBuf[30];
	int i, j;
	if (initArray == NULL)
	{
		ret = -1;
		return ret;
	}
	for (i = 0; i < num; i++)
	{
		for (j = i + 1; j < num; j++)
		{
			if (strcmp(initArray[i], initArray[j]) > 0)
			{
				strcpy(tempBuf, initArray[i]);//交换的内存块的数据
				strcpy(initArray[i], initArray[j]);
				strcpy(initArray[j], tempBuf);

			}
		}
	}
	return ret;
}
void printArray1(char initArray[10][30], int num)
{
	int i;
	for (i = 0; i < num; i++)
	{
		printf("%sn", *(initArray + i));
        //printf("%sn", initArray[i]);
	}
}
void main()
{
	int ret = 0;
	int num = 4;
	char myArray[10][30]={"ssss","2222","gggggg","88888"};
	//打印操作
	printf("排序之前:");
	printArray1(myArray, num);

	
	//排序操作
	printf("排序之后:");
	ret=sortArray1(myArray,num);


	printf("排序之后:n");
	printArray1(myArray, num);
	system("pause");
	return;
}
3.4 二级指针做输入的第一种内存模型 

        1.内存模型实例图

 2.封装函数实现第三种内存模型

//内存开辟函数
char** signMemo(int num)
{
	int i;
	char** p = NULL;
	//开辟一级数组内存块,数组中存储的地址
	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", i + 1, i + 1, i + 1);
	}
	return p;
}
//输出函数
void printArr(char** initArr, int num)
{
	int i;
	for (i = 0; i < num; i++)
	{
	//	printf("%sn", initArr[i]);
		printf("%sn", *(initArr + i));
	}
}
//排序算法
int sortArr(char** initArr, int num)
{
	int i,j;
	char* temp;
	char tempBuf[100];//交换数据的临时变量
	
	
	
	//交换内存地址实现排序
	for (i = 0; i < num; i++)
	{
		for (j = i+1; j < num; j++)
		{
			if (strcmp(initArr[i], initArr[j]) < 0)
			{
				temp = initArr[i];
				initArr[i] = initArr[j];
				initArr[j] = temp;
			}
		}
	}
}
//内存空间的释放
void free_Memo(char** p,int num)
{
	int i;
	//释放第二层内存
	for (i = 0; i < num; i++)
	{
		if (p[i] != NULL)
		{
			free(p[i]);
			p[i] = NULL;
		}
	}
	//释放第一层内存
	if (p != NULL)
	{
		free(p);
		p = NULL;
	}

}
void main()
{
	char** p = NULL;
	int num = 5;
	int i,j;
	char* temp;//交换内存地址的临时变量
	p = signMemo(num);

	printf("排序前:n");

	//调用打印函数
	printArr(p, num);
	
	//调用排序函数
	sortArr(p, num);
		
	printf("排序后:n");
	//调用打印函数
	printArr(p, num);

	//释放堆区内存
	free_Memo(p, num);
	system("pause");
	return;
}

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/297470.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号