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

【时时三省】(C语言基础)返回指针值的函数

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

一个函数可以返回一个整型值、字符值、实型值等,也可以返回指针型的数据,即地址。其概念与以前类似,只是返回的值的类型是指针类型而已。

例如“int * a ( int x,int y );”,a是函数名,调用它以后能得到一个int*型(指向整型数据)的指针,即整型数据的地址。x和y是函数a的形参,为整型。

请注意在“* a”两侧没有括号,在a的两侧分别为*运算符和( )运算符。而( )优先级高干x,因此a先与( )结合,显然这是函数形式。这个函数前面有一个x,表示此函数是指针型函数(函数值是指针)。最前面的int表示返回的指针指向整型变量。

定义返回指针值的函数的原型的一般形式为:

类型名*函数名(参数表列);

使用时要十分小心。通过下面的例子可以初步了解怎样使用返回指针的函数。

例题1:

有a个学生,每个学生有b门课程的成绩。要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数来实现。

解题思路:

定义一个二维数组score,用来存放学生成绩(为简便,设学生数a为3,课程数b为4 )。定义一个查询学生成绩的函数search,它是一个返回指针的函数,形参是指向一维数组的指针变量和整型变量n,从主函数将数组名score和要找的学生号k传递给形参。函数的返回值是&score [ k ] [ 0 ](即存放序号为k的学生的序号为0的课程的数组元素的地址)。然后在主函数中输出该生的全部成绩。

编写程序:

运行结果:

程序分析: 

函数search定义为指针型函数,它的形参pointer是指向包含4个元素的一维数组的指针变量。pointer +1指向score数组序号为1的行(学生序号是从0号算起的),* ( pointer +1 )指向1行0列元素(对pointer +1加了“*”号后,指针从行控制转化为列控制了)。search函数中的pt是指针变量,它指向float型变量(而不是指向一维数组)。main函数调用search函数,将score数组首行地址传给形参pointer(注意score也是指向行的指针,而不是指向列元素的指针)。k是要查找的学生序号。调用search函数后,main函数得到一个地址& score[k][0](指向第k个学生第0门课程,),赋给p。然后将此学生的4门课程的成绩输出。注意p是指向float型数据的指针变量,* ( p + i )表示该学生第i门课程的成绩。

请注意指针变量p,pt和pointer的区别。如果将search函数中的语句

pt = * ( pointer + n );

改为

pt = ( * pointer + n );

运行结果:得到的不是第1个学生的成绩,而是二维数组中score[0][1]开始的4个元素的值。

例题2:

对例1中的学生,找出其中有不及格的课程的学生及其学生号。

解题思路:

在例1程序基础上修改。main函数不是只调用一次search函数,而是先后调用3次search函数,在search函数中检查3个学生有无不及格的课程,如果有,就返回该学生的0号课程的地址& score [ i ] [ 0 ],否则返回NULL。在main函数中检查返回值,输出有不及格学生4门课的成绩。

编写程序:

运行结果:

程序分析:

函数search的作用是检查一个学生有无不及格的课程。在search函数中的pointer是指向一维数组(有4个元素)的指针变量。pt为指向float型变量的指针变量。从实参传给形参pointer的是score + i,它是score第i行的首地址,

在search函数中,先使pt = NULL(即pt = 0)。用pt作为区分有无不及格课程的标志。若经检查4门课中有不及格的,就使pt指向本行0列元素,即pt = & score[i][0];若无不及格则保持pt的值为NULL。将pt返回main函数。在main函数中,把调用search得到的函数值(指针变量pt的值)赋给p。用if语句判断p是否等于*(score + i),若相等,表示所查的序号为i的学生有不及格课程( p的值为* ( score + i ),即p指向i行0列元素),就输出该学生(有不及格课程的学生)4门课成绩。若无不及格,p的值是NULL,不输出。

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

相关文章:

  • TRIM功能
  • 《代码随想录》刷题记录
  • 速通python加密之MD5加密
  • Datawhale AI 夏令营:让AI理解列车排期表 Notebook(Baseline拆解)
  • JVM常见工具
  • Java 对象秒变 Map:字段自由伸缩的优雅实现
  • KTO:基于行为经济学的大模型对齐新范式——原理、应用与性能突破
  • 2025测绘程序设计国赛实战 | 基于统计滤波算法的点云去噪
  • 使用binutils工具分析目标文件(贰)
  • U514565 连通块中点的数量
  • 缓存一致性:从单核到异构多核的演进之路
  • HarmonyOS中的PX、 VP、 FP 、LPX、Percentage、Resource 详细区别是什么
  • HCIP--MGRE实验
  • CT、IT、ICT 和 DICT区别
  • Windows卷影复制的增量备份
  • 在VS Code中运行Python:基于Anaconda环境或Python官方环境
  • 人大金仓 kingbase 连接数太多, 清理数据库连接数
  • Go的内存管理和垃圾回收
  • “Datawhale AI夏令营”「结构化数据的用户意图理解和知识问答挑战赛」1
  • 使用Clion开发STM32(Dap调试)
  • 基于华为ENSP的OSPF数据报文保姆级别详解(3)
  • LeetCode——1695. 删除子数组的最大得分
  • TI MSPM0蓝牙串口通信数据包制作
  • C++11 -- emplace、包装器
  • 标准库开发和寄存器开发的区别
  • nfls dp 刷题 题解
  • AutoCAD_2025下载与保姆级安装教程
  • 【安全漏洞】防范未然:如何有效关闭不必要的HTTP请求方法,保护你的Web应用
  • cursor使用方法
  • MGER作业