C语言进修教程第六章-指针(6)
指针数组说明的一般形式为: 范例说明符*数组名[数组长度]
个中范例说明符为指针值所指向的变量的范例。譬喻: int *pa[3] 暗示pa是一个指针数组,它有三个数组元素, 每个元素值都是一个指针,指向整型变量。凡是可用一个指针数组来指向一个二维数组。 指针数组中的每个元素被赋予二维数组每一行的首地点, 因此也可领略为指向一个一维数组。图6—6暗示了这种干系。
int a[3][3]={1,2,3,4,5,6,7,8,9};
int *pa[3]={a[0],a[1],a[2]};
int *p=a[0];
main(){
int i;
for(i=0;i<3;i++)
printf("%d,%d,%d\n",a[i][2-i],*a[i],*(*(a+i)+i));
for(i=0;i<3;i++)
printf("%d,%d,%d\n",*pa[i],p[i],*(p+i));
}
本例措施中,pa是一个指针数组,三个元素别离指向二维数组a的各行。然后用轮回语句输出指定的数组元素。个中*a[i]暗示i行0列元素值;*(*(a+i)+i)暗示i行i列的元素值;*pa[i]暗示i行0列元素值;由于p与a[0]沟通,故p[i]暗示0行i列的值;*(p+i)暗示0行i列的值。读者可仔细了解元素值的各类差异的暗示要领。 应该留意指针数组和二维数组指针变量的区别。 这两者固然都可用来暗示二维数组,可是其暗示要领和意义是差异的。
二维数组指针变量是单个的变量,其一般形式中"(*指针变量名)"双方的括号不行少。而指针数组范例暗示的是多个指针( 一组有序指针)在一般形式中"*指针数组名"双方不能有括号。譬喻: int (*p)[3];暗示一个指向二维数组的指针变量。该二维数组的列数为3或解析为一维数组的长度为3。 int *p[3] 暗示p是一个指针数组,有三个下标变量p[0],p[1],p[2]均为指针变量。
指针数组也常用来暗示一组字符串, 这时指针数组的每个元素被赋予一个字符串的首地点。 指向字符串的指针数组的初始化更为简朴。譬喻在例6.20中即回收指针数组来暗示一组字符串。 其初始化赋值为:
char *name[]={"Illagal day",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"};
完成这个初始化赋值之后,name[0]即指向字符串"Illegal day",name[1]指?quot;Monday"……。
指针数组也可以用作函数参数。在本例主函数中,界说了一个指针数组name,并对name 作了初始化赋值。其每个元素都指向一个字符串。然后又以name 作为实参挪用指针型函数day name,在挪用时把数组名 name 赋予形参变量name,输入的整数i作为第二个实参赋予形参n。在day name函数中界说了两个指针变量pp1和pp2,pp1被赋予name[0]的值(即*name),pp2被赋予name[n]的值即*(name+ n)。由条件表达式抉择返回pp1或pp2指针给主函数中的指针变量ps。最后输出i和ps的值。
指针数组作指针型函数的参数
main(){
static char *name[]={ "Illegal day",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"};
char *ps;
int i;
char *day_name(char *name[],int n);
printf("input Day No:\n");
scanf("%d",&i);
if(i<0) exit(1);
ps=day_name(name,i);
printf("Day No:%2d–>%s\n",i,ps);
}
char *day_name(char *name[],int n)
{
char *pp1,*pp2;
pp1=*name;
pp2=*(name+n);
return((n<1||n>7)? pp1:pp2);
}
下例要求输入5个国名并按字母顺序分列后输出。在以前的例子中回收了普通的排序要领, 逐个较量之后互换字符串的位置。互换字符串的物理位置是通过字符串复制函数完成的。 重复的互换将使措施执行的速度很慢,同时由于各字符串(国名) 的长度差异,又增加了存储打点的承担。 用指针数组能很好地办理这些问题。把所有的字符串存放在一个数组中, 把这些字符数组的首地点放在一个指针数组中,当需要互换两个字符串时, 只须互换指针数组相应两元素的内容(地点)即可,而不必互换字符串自己。措施中界说了两个函数,一个名为sort完成排序, 其形参为指
针数组name,即为待排序的各字符串数组的指针。形参n为字符串的个数。另一个函数名为print,用于排序后字符串的输出,其形参加sort的形参沟通。主函数main中,界说了指针数组name 并作了初始化赋值。然后别离挪用sort函数和print函数完成排序和输出。值得说明的是在sort函数中,对两个字符串较量,回收了strcmp 函数,strcmp函数答允参加较量的串以指针方法呈现。name[k]和name[ j]均为指针,因此是正当的。字符串较量后需要互换时, 只互换指针数组元素的值,而不互换详细的字符串, 这样将大大淘汰时间的开销,提高了运行效率。
现编程如下:
#include"string.h"
main(){
void sort(char *name[],int n);
void print(char *name[],int n);
static char *name[]={ "CHINA","AMERICA","AUSTRALIA",
"FRANCE","GERMAN"};
int n=5;
sort(name,n);
print(name,n);
}
void sort(char *name[],int n){
char *pt;
int i,j,k;
for(i=0;i<n-1;i++){
k=i;
for(j=i+1;j<n;j++)
if(strcmp(name[k],name[j])>0) k=j;
if(k!=i){
pt=name[i];
name[i]=name[k];
name[k]=pt;
}
}
}
void print(char *name[],int n){
int i;
for (i=0;i<n;i++) printf("%s\n",name[i]);
}