因为指针也是一种数据类型,所以相同类型的指针变量就可以构成数组指针,在指针数组中每一个元素都是一个指针变量,并且指向同一数据类型。
指针数组的定义形式为:
*数据类型 数组名{整型常量表达式};
例如:
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。