当前位置: 首页 > news >正文

【时时三省】(C语言基础)指针数组和多重指针

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省

什么是指针数组

一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都存放一个地址,相当于一个指针变量。下面定义一个指针数组:

int * p [ 4 ];

由于[]比*优先级高,因此p先与[ 4 ]结合,形成p [ 4 ]形式,这显然是数组形式,表示p数组有4个元素。然后再与p前面的“*”结合,“*”表示此数组是指针类型的,每个数组元素(相当于一个指针变量)都可指向一个整型变量。注意不要写成

int ( * p ) [ 4 ];

定义一维指针数组的一般形式为

类型名*数组名[数组长度];

类型名中应包括符号“*”,如“int *”表示是指向整型数据的指针类型。

什么情况下要用到指针数组呢?指针数组比较适合用来指向若干个字符串,使字符串处理更加方便灵活。例如,图书馆有若干本书,想把书名放在一个数组中,然后要对这些书目进行排序和查询。按一般方法,字符串本身就是一个字符数组。因此要设计一个二维的字符数组才能存放多个字符串。但在定义二维数组时,需要指定列数,也就是说二维数组中每一行中包含的元素个数(即列数)相等。而实际上各字符串(书名)长度一般是不相等的。如按最长的字符串来定义列数,则会浪费许多内存单元。

可以分别定义一些字符串,然后用指针数组中的元素分别指向各字符串。如果想对字符串排序,不必改动字符串的位置,只须改动指针数组中各元素的指向(即改变各元素的值,这些值是各字符串的首地址)。这样,各字符串的长度可以不同,而且移动指针变量的值(地址)要比移动字符串所花的时间少得多。

例题1:

将若干字符串按字母顺序(由小到大)输出。

解题思路:

定义一个指针数组name,用各字符串对它进行初始化,即把各字符串中第1个字符的地址赋给指针数组的各元素。然后用选择法排序,但不是移动字符串,而是改变指针数组的各元素的指向。

编写程序:

运行结果:

程序分析:

在main函数中定义指针数组name,它有5个元素,其初值分别是“Follome " , " BASIC " , " Great Wall " , " FORTRAN”和“Computer design”这5个字符串的首字符的地址。这些字符串是不等长的。

sort函数的作用是对字符串排序。sort函数的形参name也是指针数组名,接受实参传过来的name数组首元素(即name [ 0 ])的地址,因此形参name数组和实参name数组指的是同一数组。用选择法对字符串排序。strcmp是系统提供的字符串比较函数,name [ k ]和name [ j ]是第k个和第j个字符串首字符的地址。strcmp ( name [ k ] , name [ j ] )的值为:如果name [ k ]所指的字符串大于name [ j ]所指的字符串,则此函数值为正值;若相等,则函数值为0;若小于,则函数值为负值。if语句的作用是将两个串中“小”的那个串的序号( k或i之一)保留在变量k中。当执行完内循环for语句后,从第i串到第n串这些字符串中,第k串最“小”。若k = i就表示最小的串不是第i串。故将name [ i ]和name [ k ]对换,也就是将指向第i个字符串的数组元素(是指针型元素)的值与指向第k个字符串的数组元素的值对换,也就是把它们的指向互换。

 

http://www.dtcms.com/a/301852.html

相关文章:

  • MySQL 8.4 Windows 版安装记录与步骤参考
  • 【C语言网络编程基础】DNS 协议与请求详解
  • Context Engineering Notes
  • 持续优化Cypress自动化测试
  • FunctionCall 如何使用以及如何训练
  • 从MySQL的information_schema系统数据库中获取表的元数据信息
  • Dify 1.7.0 新特性解析:工作流革新与多模态能力突破
  • 基于springboot的在线购票系统/在线售票系统
  • WSL切换网络模式
  • 【通识】正则表达式
  • 一些免费的线上学习网站
  • 《前端缓存系统构建:浏览器与Service Worker的自动清理与命中率优化策略》
  • 影刀RPA_初级课程_玩转影刀自动化_网页操作自动化
  • Frontiers in Psychology投稿LaTeX(三)
  • Frontiers in Psychology投稿流程(二)
  • BUG记录——Request接传Json数据中文乱码
  • 2025年7月世界人工智能大会最新消息
  • ABP VNext + Mapster:高性能对象映射
  • C语言——关于指针(逐渐清晰版)
  • MyBatis-Plus 多数据源配置指南
  • Android Framework知识点
  • 单链表的冒泡排序实现:从原理到代码详解
  • Linux指令(2):
  • 《频率之光》
  • 【测试报告】​​云枢馈赠系统(Java+Selenium+Jmeter自动化测试)
  • WebStack-Hugo | 一个静态响应式导航主题
  • 回归预测 | MATLAB实现BiTCN双向时间卷积神经网络多输入单输出回归预测
  • 船舶模型预测控制路径跟踪仿真研究
  • JAVA进阶--MySQL
  • 学习游戏制作记录(改进投掷剑的行为)7.27