目录
一、指针数组用于表示多个字符串
二、指针数组用于表示命令行参数
一、指针数组用于表示多个字符串
一维数组可存储一个字符串,二维数组可存储多个字符串。
二维数组的元素在内存中是连续存放的,存完第一行后,再存第二行,以此类推。所以,无论每个字符串的实际长度是否一样,在内存中都占有相同长度的存储单元,都要按照最长的字符串的长度来为每个字符串分配内存。在交换字符串时,需要对每个字符串都进行操作,因此字符串排序的速度非常慢。
指针数组(Pointer Array):
指针数组和指向数组的指针是有区别的,指向数组的指针是一个指针变量,指针变量中保存的是一个数组的首地址。
指针数组是一个数组,只不过是指针作为数组的元素,形成了指针数组。由若干个类型相同的指针所构成的数组,称为指针数组(Pointer Array)。
由定义可知,指针数组的每个元素都是一个指针,且这些指针指向相同数据类型的变量。
指针数组的最主要的用途之一就是对多个字符串进行处理操作。虽然有时字符指针数组和二维字符数组能解决同样的问,但涉及多字符串处理操作时,使用字符串指针数组比二维字符数组更有效。
例题:输入不同国家的英文名称,按首字母进行排序。
#include <stdio.h>
#include <string.h>
#define MAX_LEN 10//字符串最大长度
#define N 150//字符串个数
void sortstring(char *ptr[],int n);//作交换的函数
int main(void)
{
int i,n;
char name[N][MAX_LEN];//定义二维数组
char *pstr[N];//定义字符串指针数组
printf("How many countries?");
scanf("%d",&n);
getchar(); //读走输入缓冲区中的回车符
printf("Input their names:\n");
for(i=0;i<n;i++)
{
pstr[i]=name[i];//让pstr[i]指向二维字符数组name的第i行
gets(pstr[i]);//输入第i个字符串到pstr[i]指向的内存
}
sortstring(pstr,n);//字符串按字典顺序排序
printf("Sorted results:\n");
for(i=0;i<n;i++)
{
puts(pstr[i]);
}
return 0;
}
//函数功能:用指针数组作函数参数,采用交换法实现字符串按字典顺序排序。
void sortstring(char *ptr[],int n)
{
int i,j;
char *temp = NULL;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(strcmp(ptr[j],ptr[i])<0)
{
temp=ptr[i];
ptr[i]=ptr[j];
ptr[j]=temp;
}
}
}
}
注意:因指针数组的元素是一个指针,所以与指针变量一样,在使用指针数组之前必须对数组元素进行初始化。指针变量未初始化,其值是不确定的,此时对其进行写操作是很危险的。
在交换过程中,排序只改变了原来指针数组pstr的元素指向,并未改变二维字符数组name中字符串的排序顺序:
结尾:通过移动字符串在实际物理存储空间中的存放位置而实现的排序,称为物理排序;而用指针数组存储每个字符串的首地址时,字符串排序时无需改动字符串在内存中的存储位置,只要改变指针数组总个元素的指向即可。
这种通过移动字符串的索引地址实现的排序,称为索引排序。
二、指针数组用于表示命令行参数
在DOS操作系统下,将文件file1.c的内容复制到文件file2.c中,用如下命令:
copy file1.c file2.c
这种运行程序的方式称为命令行,copy、file1.c和file2.c称为命令行参数(Command Line Arguments)。命令行参数中的copy为赋值操作的命令名,另外两个参数file1.c和file2.c分别代表复制的源文件和目标文件的文件名,它们之间多了一个或多个空格分隔。
在c程序中,命令行参数是如何传递给程序的呢?
事实上,函数main()是通过形参获得这些参数的,因此需要使用带参数的main()形式。
例题:演示命令行参数和函数main()之间的关系。
#include <stdio.h>
int main(int argc,char *argv[])
{
int i;
printf("The number of command line arguments is :%d\n",argc);
printf("The program name is :%s\n",argv[0]);
if(argc>1)
{
printf("The other arguments are following :\n");
for(i=1;i<argc;i++)
{
printf("%s\n",argv[i]);
}
}
return 0;
}
此程序只做演示,结果如下:
命令行参数很有用,尤其在Linux操作系统下或批处理命令使用较为广泛。