在实现这一目标前我们首先得知道什么是指针数组和动态内存
1.指针数组
在C语言和C++等语言中,数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数组比较适合用来指向若干个字符串,使字符串处理更加方便、灵活。一维指针数组的定义形式为:“类型名 *数组标识符[数组长度]”
指针数组,就是说首先是一个数组,而数组的元素是指针,也就是说,如果数组元素都是相同类型的指针,则称这个数组为指针数组。所谓相同类型的指针是说指针所指向的对象类型是相同的。一维指针数组的定义形式为:
指针数组中的每一个元素均为指针,即有诸形如“ptr_array[i]”的指针。由于数组元素均为指针,因此ptr_array[i]是指第i+1个元素的指针。 [2]
例如二维指针数组的定义为:char *ptr_array[3][3]={{"asdx","qwer","fdsfaf"},{"44444","555","6666"},{"a78x","q3er","f2f"}};
2.使用动态内存的方法
例如:int *p = (int *)malloc(4);
它的意思是:请求系统分配 4 字节的内存空间,并返回第一字节的地址,然后赋给指针变量 p。当用 malloc 分配动态内存之后,上面这个指针变量 p 就被初始化了。
需要注意的是,函数 malloc 的返回值类型为 void* 型,而指针变量 p 的类型是 int* 型,即两个类型不一样,那么可以相互赋值吗?
上面语句是将 void* 型“强制类型转换”成 int*型,但事实上可以不用转换。C 语言中,void* 型可以不经转换(系统自动转换)地直接赋给任何类型的指针变量(函数指针变量除外)。
所以“int*p=(int*)malloc(4);”就可以写成“int*p=malloc(4);”。此句执行完之后指针变量 p 就指向动态分配内存的首地址了。
.....当然仅仅知道这两点实现动态内存和指针数组的灵活运用还是需要大量实践的,那么接下来就步入正题
如题
题目要求是用指针数组和动态内存的方法来完成,当然此题的解法有很多种,以下介绍常用的一种办法和指针数组+动态内存的方法:
方法一(普通方法):
#include<stdio.h>
#include<string.h>
int main()
{
char a[20][10],t[10]; //定义一个二维数组和暂存数组(用于替换)
int n=0,i,j;
while(1)
{
scanf("%s", a[n]);
if (a[n][0] == '#') break;
n++;
}
for(i=0;i<n-1;i++) //选择排序法
{
for(j=i+1;j<n;j++)
{
if(strlen(a[j])<strlen(a[i])) //strlen函数用于计算字符串的长度
{
strcpy(t,a[i]); //strcpy函数将第二个的字符串数组复制到第一个字符串数组去
strcpy(a[i],a[j]);
strcpy(a[j],t);
}
}
}
for(i=0;i<n;i++)
{
printf("%s ",a[i]); //输出时二维数组的一维表示为行首地址
}
return 0;
}
方法二(指针数组+动态内存):
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char *color[20],str[15]; //定义一个指针数组和暂存数组
int n=0,i,j;
scanf("%s",str); //读取字符串到暂存数组
while(str[0]!='#')
{
color[n]=(char *)malloc(strlen(str)); //为指针数组的每一个数组单元分配内存空间
strcpy(color[n],str); //分配的内存空间长度为字符串长度,再用strcpy函数复制给指针数组
n++;
scanf("%s",str);
}
for(i=0;i<n-1;i++) //选择排序法
{
for(j=i+1;j<n;j++)
{
if(strlen(color[j])<strlen(color[i])) //长度较长的置后 ,之后方法与方法一大同小异
{
strcpy(str,color[i]);
strcpy(color[i],color[j]);
strcpy(color[j],str);
}
}
}
for(i=0;i<n;i++)
{
printf("%s ",color[i]); //color[i]存放每一个字符串的首地址
}
return 0;
}
运行结果: