(十一)指针数组

因为指针也是一种数据类型,所以相同类型的指针变量就可以构成数组指针,在指针数组中每一个元素都是一个指针变量,并且指向同一数据类型。
指针数组的定义形式为:
*数据类型 数组名{整型常量表达式};
例如:
char *a[3]={“abc”,“bcde”,“fg”};
由于[ ]比*优先级高,所以首先是数组形式,然后才是与*的结合。因此指针数组a含3个指针a[0]、a[1]、a[2],分别为这三个字符串的起始地址。
指针数组适合用于存储若干个字符串的地址,使字符串处理更加方便灵活。与普通数组的规定一样,指针数组在内存区域中占有连续的存储空间,这时指针数组名就表示该指针数组的起始地址,指针数组在说明的同时可以进行初始化。

例:

输入一个表示月份的整数,输出该月份的名字。

源程序:

#include<stdio.h>
{
	int 	n;
	char		*month_name[ ]={"Error","January","February","March",“April”,"May","June","July","August","September","October","November","December"};
	printf("input a integer: ");
	scanf(%d”,&n);
	if(n>1&&n<12)
		printf("%s\n",month_name[n]);
	else
		print("%s\n",month_name[0])
}

例:
在主函数中输入10个长度不超过10的字符串,用另一个函数对它们排序,然后在主函数中输出这10个已排好序的字符串。要求用指针数组来处理。

分析:

字符串有两种表示方法,分别是字符数组、字符指针。
多个字符串的表示可以使用二维数组(即若干个一维数组)或指针数组(即字符指针的数组)。

指针数组的概念:

**一个数组,其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都相当于一个指针变量。**如定义一个字符指针数组char *str[10],就相当于定义了10个字符串,其中第j个字符串名就是str[j]。

选择排序的基本思想:扫描整个待排序序列,从中选择最小元素,将它们交换到序列的最前面,然后对剩下的字序列采用同样的方法,直到子序列为空。.

源程序:

#include<stdio.h>
#include<string.h>
void sort(char *p[],int n)			/对n个字符串进行从小到大排序
{
	int	i,j,k;
	char temp[10];
	for(i=0;i<n-1;i++)				/寻找第i个最小元素,并放在第i个位置上
	{
 		k=i;						/k用来记录第i个最小元素的当前位置
 		for(j=i+1;j<n;j++)
 			if(strcmp(p[j],p[k])<0)
 				k=j;
 		if(k!=i)
 		{
 			strcpy(temp,p[i]);
 			strcpy(p[i],p[k]);
 			strcpy(p[k],temp);
		}
	}
}
void main( )
{
		int 	i;
		char		*p[10],str[10][10];
		printf("inputs 10 strings:\n");
		for(i=0;i<10;i++)
		{
			scanf("%s",str[i]);
			  p[i]=str[i];			/将第i个字符串的首地址赋给指针数组p的第i个元素
		 }
	    sort(p,10);
	    printf("Now,the sequence is:\n");
	    for(i=0;i<10;i++)
			printf("%s\n",p[i]);

}

程序说明:

使用字符指针变量和字符数组表示字符串有一个非常重要的区别。
字符数组一旦定义,在编译时就为它分配了内存单元,它就有了确切的地址,就可以直接使用。

字符指针变量不能一定义就用,必须先指明它是指向哪个字符串的,也就是字符指针变量使用之前必须赋予它一个明确的地址值。

所以程序的main函数中,除了定义p指针数组,还定义了一个二维数组str[10][10],因为可以给str直接赋予键盘输入的初值,而不可以给p直接这样赋初值,所以要借助str给p赋予初值。

在函数sort()中,如果将语句char temp[10]改为char *temp,程序也会出错,因为在函数的后面有语句strcpy(temp,p[i]),这样就相当于还没有明确temp具体指向哪一段内存单元,就给temp所指的内存单元存放数据,这是很危险的。

但是,如果将char temp[10]改为char *temp,再将strcpy(temp,p[i])改为temp=p[i],将strcpy(p[i],p[k])改为p[i]=p[k],将strcpy(p[k],temp)改为p[k]=temp,程序就正确了。
*就相当于char temp;temp=“abdfdf”;这是正确的,因为这两条语句的功能是把字符串“abdfdf”的首地址赋予temp。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值