Chinaunix首页 | 论坛 | 博客
  • 博客访问: 266359
  • 博文数量: 77
  • 博客积分: 210
  • 博客等级: 入伍新兵
  • 技术积分: 451
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-10 09:49
文章分类

全部博文(77)

文章存档

2012年(77)

分类:

2012-05-20 21:45:59

原文地址:C语言教程第六章:指针(6) 作者:sdccf


  数组说明的一般形式为: 类型说明符*数组名[数组长度]
  其中类型说明符为值所指向的变量的类型。例如: 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;ik=i;
for(j=i+1;jif(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}

阅读(616) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~