一、普通排序方法
#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) ); //
}
}