前言
在理解二维数组和数组指针的结合使用、指针数组相关内容后,会更易于理解。
(一)需要的相关知识
- 指针数组存放常量字符串和二维数组结构存储的字符串
- 排序算法:冒泡排序
- 字符串比较函数string.h中的strcmp函数、字符串拷贝strcpy函数,也有仿写过
1
(二)代码实现
(1)指针数组指向的字符串常量
分析:
- 字符串常量存放在.rodata段,属于只读数据区,只能读取,不能修改,所以交换数据只能交换指针数组中的指针的指向
代码实现:
#include <stdio.h>
#include <string.h>
#if 1
void ShowCharptrArr(const char** arrname, int size)
{
if(arrname == NULL) return;
if(size <= 0) return;
for(int i = 0; i < size; i++)
{
printf("%s\n", arrname[i]);
}
}
void BubbleSortString(const char** arrname, int size)
{
if(arrname == NULL || size < 2)
return;
for(int i = 0; i < size - 1; i++)
{
for(int j = 0; j < size - i - 1; j++)
{
if(strcmp(arrname[j], arrname[j + 1]) > 0)
{
const char* tmp = arrname[j];
arrname[j] = arrname[j + 1];
arrname[j + 1] = tmp;
}
}
}
}
int main ()
{
const char* namebuff[] = {"XingQiu", "Xiangling", "ChongYun", "HuTao"};
BubbleSortString(namebuff, 4);
ShowCharptrArr(namebuff, 4);
return 0;
}
#endif
结果:
(2)使用二维数组存放字符串
分析:
- 二维数组的遍历使用数组指针来传参
- 二维数组的数组名就是首个一维数组的首地址
- 实参就是二维数组名
- 拷贝的时候不能直接使用
=
,使用字符串拷贝strcpy函数进行拷贝
代码实现:
#if 1
#include <stdio.h>
#include <string.h>
void ShowSecondArr( char (*p)[128], int size)
{
if(p == NULL|| size <= 0) return;
int i;
for(i = 0; i < size; i++)
{
printf("%s\n", p[i]);
}
}
void BubbleSort( char (*p)[128], int size)
{
if(p == NULL || size <= 0) return;
int i;
int j;
for(i = 0; i < size; i++)
{
for(j = 0; j < size - i - 1; j++)
{
if(strcmp(p[j], p[j+1]) > 0)
{
char tmp[128] = {0};
strcpy(tmp, p[j]);
strcpy(p[j], p[j+1]);
strcpy(p[j+1], tmp);
}
}
}
}
int main ()
{
char arrname[5][128] = {{"XingQiu"}, {"Xiangling"}, {"ChongYun"}, {"HuTao"}};
BubbleSort(arrname, 4);
ShowSecondArr(arrname, 4);
return 0;
}
#endif
结果:
参考资料: