学习指针数组,总结一下它的概念和应用

  1. 指针数组概念
    指针数组是指每一个数组元素均用来存储一个指针值的数组,即指针数组中的每一个元素都是指针变量。
    例如:
    1. int *p[5];
    注意
    指针数组与指向一维数组的指针变量的声明形式上不同。
    1. int *p[10];
    2. int (*p)[10];
    语句一中由于运算符[]的优先级高于,所有p先与[10]结合,形成数组p[10],然后p[10]再与结合,*就表示数组类型是指针型,再与int结合,表示访问数据类型是int。语句二是指针变量的声明语句。
    1. int a[4][5];
    2. int *p[4]={a[0],a[1],a[2],a[3]};
    声明二维数组,a[i]都是行指针,再声明指针数组p并初始化,且p[i]指向a[i][0],,p[i]+j就指向a[i][j],所有,由指针知识可以推知a[i][j]与(p[i]+j)与(*(p+i)+j)等价。
  2. 指针数组的应用(书中总结)
    用指针数组处理指向若干个字符串的问题可以使得字符串的处理变得更加灵活和方便。
    例如,有四本书,每本书都有一个书名,可以采用二维字符数组来处理这四本书的资料管理。
    但缺点是每一本书的书名所占字节数相等,但书名是不相等的,所以二维数组的列数必须按最大字符串的长度来准备,这样会造成许多内存单元的浪费。并且在诸如字符串的排序等问题的处理上也较慢。如果采用指针数组来处理,问题就可以得到缓解。首先可以声明一个字符指针数组book,然后让指针数组的每一个元素分别指向一个字符常量。
    那么,对所有图书按字母顺序由小到大排序输出书名,代码如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void sort(char *p[],int),prn(char *p[],int); //声明函数原型
  4. int main()
  5. {
  6. char *book[]={"The C language","Database Design","Database System","Software Engineering"};
  7. sort(book,4); //实参book是指针数组名
  8. prn(book,4);
  9. return 0;
  10. }
  11. /*按升序对指针数组p所指向的若干字符串排序*/
  12. void sort(char *p[],int n){
  13. int i,j,minpost;
  14. char *t;
  15. for (i=0;i<n-1;i++){ //用选择排序法排序
  16. minpost=i;
  17. for (j=i+1;j<n;j++)
  18. if (strcmp(p[j],p[minpost])<0) //比较两个字符串大小
  19. minpost=j;
  20. if (minpost!=i){
  21. t=p[i]; p[i]=p[minpost]; p[minpost]=t;//交换指针数组元素的指向
  22. }
  23. }
  24. }
  25. void prn(char *p[],int n)
  26. {
  27. int i;
  28. for (i=0;i<n;i++){
  29. printf("%s\n",p[i]);
  30. }
  31. }

运行结果是:

  1. Database Design
  2. Database System
  3. Software Engineering
  4. The C language

欢迎指出错误。:point_right: :speech_balloon:

点赞(0)
 

9.9 分

1 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论