2021-08-09-02 二级指针做输入内存模型-第二种02二维数组-分析及内存图

一、普通排序方法

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

void main()
{
	int i = 0, j = 0;
	int num = 4;
	char myBuf[30];
	char tmpBuf[30];
	char myArray[10][30] = {"aaaaaa", "ccccc", "bbbbbbb", "1111111111111"};

	//打印 
	printf("排序之前\n");
	for (i=0; i<num; i++)
	{
		printf("%s\n", myArray[i]);
	}

	for (i=0; i<num; i++)
	{
		for (j=i+1; j<num; j++)
		{
			if (strcmp (myArray[i],  myArray[j]) > 0)
			{
				strcpy(tmpBuf, myArray[i]);  //交换的是内存块
				strcpy(myArray[i], myArray[j]);
				strcpy(myArray[j], tmpBuf);
			}
		}
	}

	//打印 
	printf("\n排序之后\n");
	for (i=0; i<num; i++)
	{
		printf("%s\n", myArray[i]);
	}


	printf("hello...\n");
	system("pause");
	return ;
}

在这里插入图片描述

二、使用函数进行封装

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

void printMyArray02(char myArray[10][30], int num) //步长为30个内存单元
{
	int i = 0;
	for (i=0; i<num; i++)
	{
		//printf("%s \n", myArray[i]);
		printf("%s, &myArray[%d]=%p \n", *(myArray+i), i, myArray[i]);  //
	}
}



//交换的是内存块
void sortMyArray02(char myArray[10][30], int num)
{
	int i, j = 0;
	char tmpBuf[30];
	
	for (i=0; i<num; i++)
	{
		for (j=i+1; j<num; j++)
		{
			if (strcmp (myArray[i],  myArray[j]) > 0) //myArray[i][]行地址
			{
				strcpy(tmpBuf, myArray[i]);  //交换的是内存块
				strcpy(myArray[i], myArray[j]);
				strcpy(myArray[j], tmpBuf);			
			}
		}
	}
}


void main()
{
	int i = 0, j = 0;
	int num = 4;
	char myBuf[30];
	char tmpBuf[30];
	char myArray[10][30] = {"aba", "ccc", "bbb", "111"};

	//myArray[10][30]:有10行 ,每行30列。myArray+1跳转下一行,步长为30个单元。
	
	//打印 
	printf("\n排序之前\n\n");	
	printMyArray02(myArray, num);
	
	//进行排序
	sortMyArray02(myArray, num);
	
	//打印 
	printf("\n排序之后\n");
	printMyArray02(myArray, num);


	printf("hello...\n");
	system("pause");
	return ;
}

在这里插入图片描述

三、使用函数进行封装-内存分析图

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

void printMyArray02(char myArray[10][30], int num) //步长为30个内存单元
{
	int i = 0;
	for (i=0; i<num; i++)
	{
		//printf("%s \n", myArray[i]);
		printf("%s, &myArray[%d]=%p \n", *(myArray+i), i, myArray[i]);  //
	}
}



//交换的是内存块
void sortMyArray02(char myArray[10][30], int num)
{
	int i, j = 0;
	char tmpBuf[30];
	
	for (i=0; i<num; i++)
	{
		for (j=i+1; j<num; j++)
		{
			if (strcmp (myArray[i],  myArray[j]) > 0) //myArray[i][]行地址
			{
				printf("\n***************************************************************************\n");
				printf("外层交换的第%d次,内层交换的第%d次:\n", i, j);
				printf(" myArray[%d]=[%p]为字符串=%s|| myArray[%d]=[%p]为字符串=%s \n", 
			i, myArray[i], *(myArray+i), j, myArray[j], *(myArray+j));

				strcpy(tmpBuf, myArray[i]);  //交换的是内存块
				strcpy(myArray[i], myArray[j]);
				strcpy(myArray[j], tmpBuf);

				printf("\n交换后\n");
				printf(" myArray[%d]=[%p]为字符串=%s|| myArray[%d]=[%p]为字符串=%s \n", 
			i, myArray[i], *(myArray+i), j, myArray[j], *(myArray+j));
			
			
			}
		}
	}
	printf("\n***************************************************************************\n");
	
}


void main()
{
	int i = 0, j = 0;
	int num = 4;
	char myBuf[30];
	char tmpBuf[30];
	char myArray[10][30] = {"aba", "ccc", "bbb", "111"};

	//myArray[10][30]:有10行 ,每行30列。myArray+1跳转下一行,步长为30个单元。
	printf("创建二维数组后,立马打印相关信息\n");
	printf("&myArray[0]=%p\t myArray[0]=%s\t\n", &myArray[0], myArray[0] );
	printf("&myArray[0][1]=%p\t myArray[0][1]=%c\t \n", &myArray[0][1], myArray[0][1] );
	printf("&myArray[0][29]=%p\n\n ", &myArray[0][29]);
	
	printf("&myArray[1]=%p\t myArray[1]=%s\t \n", &myArray[1], myArray[1] );
	printf("&myArray[1][29]=%p\n\n ", &myArray[1][29]);

	printf("&myArray[2]=%p\t myArray[2]=%s\t \n", &myArray[2], myArray[2] );
	printf("&myArray[2][29]=%p\n\n ", &myArray[2][29]);

	printf("&myArray[3]=%p\t myArray[3]=%s\t \n", &myArray[3], myArray[3] );
	printf("&myArray[3][29]=%p\n\n ", &myArray[3][29]);
	
	
	//打印 
	printf("\n排序之前\n\n");	
	printMyArray02(myArray, num);
	
	//进行排序
	sortMyArray02(myArray, num);
	
	//打印 
	printf("\n排序之后\n");
	printMyArray02(myArray, num);

	printf("排序完\n");
	printf("&myArray[0]=%p\t myArray[0]=%s\t\n", &myArray[0], myArray[0] );
	printf("&myArray[0][1]=%p\t myArray[0][1]=%c\t \n", &myArray[0][1], myArray[0][1] );
	printf("&myArray[0][29]=%p\n\n ", &myArray[0][29]);
	
	printf("&myArray[1]=%p\t myArray[1]=%s\t \n", &myArray[1], myArray[1] );
	printf("&myArray[1][1]=%p\t myArray[1][1]=%c\t \n", &myArray[1][1], myArray[1][1] );
	printf("&myArray[1][29]=%p\n\n ", &myArray[1][29]);
	
	printf("&myArray[2]=%p\t myArray[2]=%s\t \n", &myArray[2], myArray[2] );
	printf("&myArray[2][29]=%p\n\n ", &myArray[2][29]);
	
	printf("&myArray[3]=%p\t myArray[3]=%s\t \n", &myArray[3], myArray[3] );
	printf("&myArray[3][29]=%p\n\n ", &myArray[3][29]);
	
	
	printf("hello...\n");
	system("pause");
	return ;
}

在这里插入图片描述

一种错误的传参方式

问题在于:指针的步长不一样 指针所指向的内存空间的数据类不一样。

void printMyArray02_err(char **myArray, int num)
{
	int i = 0;
	for (i=0; i<num; i++)
	{
		//printf("%s \n", myArray[i]);
		printf("%s \n", *(myArray+i) );  //
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大大枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值