chunlanse2014

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

第十三节 指针数组的概念(十四)

一个数组的元素值为指针则是指针数组。 指针数组是一组有序的指针的集合。 指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。指针数组说明的一般形式为:
    类型说明符 *数组名[数组长度]
其中类型说明符为指针值所指向的变量的类型。例如:
    int *pa[3]
表示pa是一个指针数组,它有三个数组元素,每个元素值都是一个指针,指向整型变量。

【例10-33】通常可用一个指针数组来指向一个二维数组。指针数组中的每个元素被赋予二维数组每一行的首地址,因此也可理解为指向一个一维数组。

复制代码
 1 main()
 2 {
 3     int a[3][3]={1,2,3,4,5,6,7,8,9};
 4     int *pa[3]={a[0],a[1],a[2]};
 5     int *p=a[0];
 6     int i;
 7     for(i=0;i<3;i++)
 8         printf("%d,%d,%d\n",a[i][2-i],*a[i],*(*(a+i)+i));
 9     for(i=0;i<3;i++)
10         printf("%d,%d,%d\n",*pa[i],p[i],*(p+i));
11 }
复制代码

 

本例程序中,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]均为指针变量。

指针数组也常用来表示一组字符串,这时指针数组的每个元素被赋予一个字符串的首地址。指向字符串的指针数组的初始化更为简单。例如在例10-32中即采用指针数组来表示一组字符串。其初始化赋值为:

复制代码
 1 char *name[]=
 2 {"Illagal day",
 3   "Monday",
 4   "Tuesday",
 5   "Wednesday",
 6   "Thursday",
 7   "Friday",
 8   "Saturday",
 9   "Sunday"
10 };
复制代码

 

完成这个初始化赋值之后,name[0]即指向字符串"Illegal day",name[1]指向"Monday"......。

指针数组也可以用作函数参数。

【例10-34】指针数组作指针型函数的参数。在本例主函数中,定义了一个指针数组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的值。

复制代码
 1 main()
 2 {
 3     static char *name[]=
 4     { "Illegal day",
 5        "Monday",
 6        "Tuesday",
 7        "Wednesday",
 8        "Thursday",
 9        "Friday",
10        "Saturday",
11        "Sunday"
12      };
13     char *ps;
14     int i;
15     char *day_name(char *name[],int n);
16     printf("input Day No:\n");
17     scanf("%d",&i);
18     if(i<0) 
19         exit(1);
20     ps=day_name(name,i);
21     printf("Day No:%2d-->%s\n",i,ps);
22 }
23 char *day_name(char *name[],int n)
24 {
25     char *pp1,*pp2;
26     pp1=*name;
27     pp2=*(name+n);
28     return((n<1||n>7)? pp1:pp2);
29 }
复制代码

 

【例10-35】输入5个国名并按字母顺序排列后输出。现编程如下:

复制代码
 1 #include"string.h"
 2 main()
 3 {
 4     void sort(char *name[],int n);
 5     void print(char *name[],int n);
 6     static char *name[]=
 7     { "CHINA",
 8        "AMERICA",
 9        "AUSTRALIA",
10        "FRANCE",
11        "GERMAN"
12     };
13     int n=5;
14     sort(name,n);
15     print(name,n);
16 }
17 void sort(char *name[],int n)
18 {
19     char *pt;
20     int i,j,k;
21     for(i=0;i<n-1;i++)
22     {
23         k=i;
24         for(j=i+1;j<n;j++)
25         if(strcmp(name[k],name[j])>0) 
26             k=j;
27         if(k!=i)
28         {
29             pt=name[i];
30             name[i]=name[k];
31             name[k]=pt;
32          }
33     }
34 }
35  void print(char *name[],int n)
36 {
37     int i;
38     for (i=0;i<n;i++) 
39         printf("%s\n",name[i]);
40 }
复制代码

 

说明:
1) 在以前的例子中采用了普通的排序方法,逐个比较之后交换字符串的位置。交换字符串的物理位置是通过字符串复制函数完成的。反复的交换将使程序执行的速度很慢,同时由于各字符串(国名)的长度不同,又增加了存储管理的负担。用指针数组能很好地解决这些问题。把所有的字符串存放在一个数组中,把这些字符数组的首地址放在一个指针数组中,当需要交换两个字符串时,只须交换指针数组相应两元素的内容(地址)即可,而不必交换字符串本身。

2) 本程序定义了两个函数,一个名为sort完成排序,其形参为指针数组name,即为待排序的各字符串数组的指针。形参n为字符串的个数。另一个函数名为print,用于排序后字符串的输出,其形参与sort的形参相同。主函数main中,定义了指针数组name 并作了初始化赋值。然后分别调用sort函数和print函数完成排序和输出。值得说明的是在sort函数中,对两个字符串比较,采用了strcmp函数,strcmp函数允许参与比较的字符串以指针方式出现。name[k]和name[j]均为指针,因此是合法的。字符串比较后需要交换时,只交换指针数组元素的值,而不交换具体的字符串,这样将大大减少时间的开销,提高了运行效率。

posted on   chunlanse2014  阅读(156)  评论(0编辑  收藏  举报

(评论功能已被禁用)
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示