打印 排序:
void main()
{
int i = 0,j=0;
int num = 4;
char tmpbuf[30] = {0};
char myBuf[30] = {0};
char myArray[10][30] = { "aaaaaa", "ccccc", "bbbbb", "1111111" };
//打印
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_s(tmpbuf,myArray[i]); //交换的是内存块 是拷贝
strcpy_s(myArray[i],myArray[j]);
strcpy_s(myArray[j],tmpbuf);
}
}
}
for (i = 0; i < num; i++)
{
printf("%s\n", myArray[i]);
}
printf("\nhehhe");
system("pause");
return;
}
封装成函数:
void printMyArray02(char myArray[10][30],int num)
{
int i = 0;
for (i = 0; i < num; i++)
{
printf("%s\n", myArray[i]);// printf("%s\n", *(myArray+i));
}
}
void sortArray02(char myArray[10][30], int num)
{
int i = 0, j = 0;
char tmpbuf[30] = { 0 };
//排序
for (i = 0; i < num; i++)
{
for (j = i + 1; j < num; j++)
{
if (strcmp(myArray[i], myArray[j]) > 0)//前面的大 交换
{
strcpy_s(tmpbuf, myArray[i]); //交换的是内存块 是拷贝
strcpy_s(myArray[i], myArray[j]);
strcpy_s(myArray[j], tmpbuf);
}
}
}
}
void main()
{
int num = 4;
char myBuf[30] = { 0 };
char myArray[10][30] = { "aaaaaa", "ccccc", "bbbbb", "1111111" };
//myArray: 编译器只会关心 有10行 每行30列 所以myArray+1 会直接往跳一行 30个单元
//myArray[i] *(myArray+i)对于二维数组 它们直接加相应的行数 这就是多维数组名的本质 名加1代表增加相应的行数
{
int len1 = sizeof(myArray); //300 这是求出这数据类型的总大小
int len2 = sizeof(myArray[0]);//30 这样是求每一行的大小
//int len2 = sizeof(myArray[0][0]);//1 这样才是求每一个元素的大小
int size = len1 / len2;//10 所以求出的是行数
printf("size:%d\n", size);
}
printMyArray02(myArray, num);
sortArray02(myArray,num);
printMyArray02(myArray, num);
printf("\nhehhe");
system("pause");
return;
}
但是调用第一种内存模型的printMyArray01是错误的:
void printMyArray01_err(char**myArray, int num)
{
int i = 0;
for (i = 0; i < num; i++)
{
printf("%s\n", myArray[i]);
}
}
问题的本质是:二级指针做输入的第一种内存模型 myArray+1
二级指针做输入的第二种内存模型 myArray+1 不一样
原因在于多维数组名的本质是一个数组类型的指针 并不是二级指针