指针和数组--指针数组及其应用

目录

一、指针数组用于表示多个字符串

二、指针数组用于表示命令行参数


一、指针数组用于表示多个字符串

        一维数组可存储一个字符串,二维数组可存储多个字符串。

        二维数组的元素在内存中是连续存放的,存完第一行后,再存第二行,以此类推。所以,无论每个字符串的实际长度是否一样,在内存中都占有相同长度的存储单元,都要按照最长的字符串的长度来为每个字符串分配内存。在交换字符串时,需要对每个字符串都进行操作,因此字符串排序的速度非常慢。

指针数组(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操作系统下或批处理命令使用较为广泛。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值