② 无返回值函数:此类函数用于完成某项特定的处理任务,执行完成后不向调用者返回函数值。C语言提供了极为丰富的库函数,这些库函数又可从功能角度进行以下分类。习惯上把调用者称为主调函数。根据图4-40,P0端口连接8位LED灯,利用标准库函数实现流水灯的控制。......
2023-11-17
系统标准库中有许多返回指针值的函数,如字符串处理、存储分配等标准库函数。返回指针值函数定义的一般形式:
数据类型符 *函数名(形式参数表及定义)
上式中,数据类型符用指针类型(数据类型符*)表示,标识指针类型的星号(*)可以靠近数据类型名一侧,也可以靠近函数名一侧,习惯上书写为靠近函数名。例如,设有函数定义的头部为:
float*fun(int m)
那么,fun是函数名,返回值类型是float*(即单精度实型地址类型),该返回值类型表示函数调用后会返回一个指向实型数据指针值。
返回指针值的函数的调用与普通函数的参数传递相同,所不同的是需要定义一个与其返回值数据类型相同的指针变量来接收返回值。
上面程序中,函数fac是一个返回整型指针值的函数,每次执行后返回函数中定义的静态变量p的地址给主调函数中的指针变量pi,然后在主调函数中使用指针变量的指针运算形式*pi取出指针变量所指向数据对象(fac函数中的p)值进行累加。程序一次运行结果如下:
Input n:6//输入数据
Sum=873
定义和使用返回指针值函数必须要注意的是:那些在函数中定义的自动变量的生存期仅与函数调用时间相当,当函数调用结束返回时会自动被系统撤销,所以返回指针值的函数中,不能返回这些自动变量的地址。能够在被调函数中被返回地址值的变量只能是全局变量或者静态局部变量。下面通过一个错误的返回指针值函数示例进行分析。(www.chuimin.cn)
【例8.2】 统计[1,1234]中有多少个数能够被3整除。
}
例8.2程序的函数fun中,将局部变量i的地址值作为函数的返回值,但局部变量i的生存期仅与函数fun执行时间相当,当函数fun调用结束后变量i已经被系统自动撤销(i的存储空间已经被收回),将变量i的地址值返回给main函数中的count就存在一个潜在错误,程序运行时可能出现不可预料的错误。这种错误在较老的C编译器中可能检查不出来,但使用较新的编译系统能够检查出这种错误,例如,VC6编译系统的提示信息是:warning C4172:returning address of local variable or temporary(错误C4172:返回局部变量或局部数据的地址)。函数fun的正确定义形式如下,请读者对照分析:
设函数的原型为:int*getdata(int num);,函数的功能是获取一个存放到连续存储区域的数据序列,序列中数据的个数由参数num指定,函数最多能够获取由100个整数组成的序列,当要求的数量(由num指定)超过100个时,函数拒绝进行数据采集,返回空值(NULL)。下面展示的是错误设计方法和正确设计方法的比较,请读者仔细分析。
通过上面函数对照可以看出,设计正确与否主要在于函数内使用的数组是否静态数组。返回指针值函数设计最重要的一点是其返回值(指针),总体原则是:返回的指针所对应的内存空间不能因该指针函数的返回而被释放掉。返回的指针通常有以下几种:
①函数中动态分配的内存(通过malloc等实现)的首地址;
②函数中的静态(static)变量或全局变量所对应的存储单元的首地址;
③通过指针形参所获得的实参的有效地址。
有关C语言程序设计基础(第3版)的文章
② 无返回值函数:此类函数用于完成某项特定的处理任务,执行完成后不向调用者返回函数值。C语言提供了极为丰富的库函数,这些库函数又可从功能角度进行以下分类。习惯上把调用者称为主调函数。根据图4-40,P0端口连接8位LED灯,利用标准库函数实现流水灯的控制。......
2023-11-17
指针变量既可以作为函数的形参,也可以作为函数的实参。所以,为了解决通过被调用函数来实现主调函数中变量值的改变,必须使用指针变量作为函数的形参。在执行被调用函数时,使形参指针变量所指向的变量的值发生变化。函数调用完成后,通过不变的实参指针变量将变化的值保留下来。图6.8程序运行结果说明:函数swap 的形参是两个整型指针变量p1 和p2,故主函数在调用时,必须使用变量a 和b 的地址,即&a 和&b 作为实参。......
2023-10-21
图8.1函数内存映射方式1.指向函数指针变量的定义C语言中可以定义指针变量来存储函数的首地址,并利用该指针变量对函数进行调用。指向函数的指针变量的真正作用是作为函数参数使用,使程序在功能的实现上具有更大的灵活性。指向函数的指针变量求最大值、最小值和两数之和。......
2023-11-20
取内容运算符*,又称间接引用运算符,结合性自右而左,用来表示指针变量所指的变量。指针变量定义时,“*”仅表示其后的变量是指针类型变量。图6.5指针的算术操作若设指针变量p 的值为2000,对于整型数据,其长度是2 个字节。然后,通过指针变量升序输出。图6.7指针变量p1 和p2 交换前后的指针方向......
2023-10-21
void类型指针中的数据不能访问,如果非要访问的话,可以通过强制转换将void类型指针转换为与所指向的数据类型相符的类型。所谓“相同存储对齐限制”是指void类型指针所指的数据在内存中所占的长度与显式转换后的指针所指的数据在内存中所占的长度相等。同理,如果是将void类型转换为具有更小存储对齐限制的指针时,也可能引起数值的改变。......
2023-11-18
对一维数组的引用,既可以用传统的数组元素的下标法,也可使用指针的表示方法。例7.11输入10个数,采用指针变量表示的地址法输入输出数组各元素。由于数组元素在内存是连续存放的,若给指向整型变量的指针传递数组的首地址,则该指针指向二维数组。#include<stdio.h>例7.16用指针法输入输出二维数组各元素。......
2023-11-18
类的每一个成员函数都有一个隐含的特殊指针,通常称为this指针,this指针的类型就是成员函数所属的类型。通常不显式使用this指针。this指针是C++实现封装的一种机制,它将对象和该对象调用的成员函数连接在一起,在外部看来,每个对象都拥有自己的成员函数。this指针一般用于返回当前对象自身。程序的执行结果如下:s1∶n=2s2∶n=1s3∶n=3this指针大量用于运算符重载成员函数设计中,这将在后面详细介绍。......
2023-11-07
图5.7两层函数嵌套调用示意图函数的嵌套调用即一个函数在被调用的过程中又调用了另外的一个函数。函数fac和powers的返回值类型均被设计为double型,其主要目的是为了避免n!x:0.5//0.5从键盘输入的数据0.50 powers of e=1.648721//程序执行结果......
2023-11-20
相关推荐