void sortc(char *p[])
{
//利用指针数组
int i = 0,j = 0;
char** temp;//指向字符串指针的指针
for (i = 0; i < 10 - 1; i++)
{
for (j = 0; j < 10 - i - 1; j++)
{
if (strcmp(p[j], p[j+1]) > 0)
{
//没有改变字符串本身的内容,也没有移动字符串在内存中的位置。
//我们只是改变了指针数组 p 中指针的指向,使它们指向了不同的字符串。
temp = p[j];
p[j] = p[j + 1];
p[j + 1] = temp;
}
}
}
}
void sortc2(char (*p)[4])
{
//利用数组指针
int i = 0,j = 0;
char c[10],*temp=c;//指向 字符串
for (i = 0; i < 10 - 1; i++)
{
for (j = 0; j < 10 - i - 1; j++)
{
if (strcmp(p[j], p[j+1]) > 0)
{
strcpy(temp,p[j]);//交换字符串内容
strcpy(p[j],p[j+1]);
strcpy(p[j+1],temp);
}
}
}
}
int main()
{
int i=0;
//char *p[10]={"abc","def","ghi","jkm","nop",
// "qst","uvw","xyz","aaa","vvv"};
char str[10][4]={"abc","def","ghi","jkm","nop",
"qst","uvw","xyz","aaa","vvv"};
char (*p)[4];
p=str;
printf("调换前:\n");
for(i=0;i<10;i++)
printf("%s\n",str[i]);
sortc2(p);
printf("\n调换后:\n");
for(i=0;i<10;i++)
printf("%s\n",str[i]);
return 0;
}
在sortc
和sortc2
这两个函数中,p[j]
的基本作用都是用来访问字符串数组中的第j
个字符串,但是它们所指向的字符串的存储方式有所不同,这导致了在交换字符串时处理方式的不同。
在sortc
中:
void sortc(char *p[]) {
// ...
if (strcmp(p[j], p[j+1]) > 0) {
// 交换两个指针的值
char *temp = p[j];
p[j] = p[j+1];
p[j+1] = temp;
}
// ...
}
这里的p
是一个指向字符指针的指针(char *p[]
或等价地char **p
),它指向一个字符串指针数组。因此,p[j]
的类型是char *
,即一个指向字符的指针,它指向动态分配的内存中的某个字符串。在sortc
中,我们直接交换了这些指针的值,而不是字符串的内容。这意味着我们改变了指针数组p
中指针的指向,但并没有改变字符串本身在内存中的位置或内容。
在sortc2
中:
void sortc2(char (*p)[4]) {
// ...
if (strcmp(p[j], p[j+1]) > 0) {
// 交换两个字符串的内容
strcpy(temp, p[j]);
strcpy(p[j], p[j+1]);
strcpy(p[j+1], temp);
}
// ...
}
这里的p
是一个指向字符数组的指针(char (*p)[4]
),它指向一个包含固定大小字符数组的数组。因此,p[j]
的类型是char[4]
,即一个包含4个字符的数组。在sortc2
中,我们通过strcpy
函数来交换两个字符串的内容。这意味着我们复制了字符串的实际字符,从一个位置到另一个位置,而不是改变指针的指向。
总结来说,sortc
中的p[j]
是指向动态分配字符串的指针,而sortc2
中的p[j]
是指向固定大小字符数组的引用。在sortc
中,我们交换指针;在sortc2
中,我们交换字符串内容。这两种方法都实现了字符串数组的排序,但处理字符串的方式不同。