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:--->%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]);
}




版权声明: 原创作品,答允转载,转载时请务必以超链接体式格局标明文章 原始出处 、作者信息和本声明。不然将追究执法责任。

原文地址:https://www.cnblogs.com/zgqjymx/p/1975589.html