margin-top: 0px; margin-bottom: 0px; padding: 0px; overflow-wrap: break-word; clear: both; text-indent: 2em; color: rgb(24, 30, 51); font-family: PingFangSC, 微软雅黑, 黑体, Arial, Helvetica, sans-serif; font-size: 18px; background-color: rgb(255, 255, 255);">1.指针作函数的参数
padding: 0px; overflow-wrap: break-word; clear: both; text-indent: 28px; color: rgb(24, 30, 51); font-family: PingFangSC, 微软雅黑, 黑体, Arial, Helvetica, sans-serif; font-size: 18px; background-color: rgb(255, 255, 255);">函数的参数不止可以是整数、浮点型、字符型等数据,还可以是指针类型,以指针作为函数参数可以实现一些其他类型无法完成的功能,使C程序更为方便灵活。
指针作为函数参数的作用是将一个变量的地址传送给被调用函数的形参,我们来看一个简单的例子:
【例7-12】利用指针对两个整数排序
#include<iostream.h>
#include "stdlib.h"
void swap(int *p1,int *p2); //函数声明
int main()
{
int *p1,*p2,a,b; //定义指针变量p1,p2,整型变量a,b
cin>>a>>b;
p1=&a; //使p1指向a
p2=&b; //使p2指向b
if(a<b)
swap(p1,p2); //如果a<b,使*p1和*p2互换
cout<<"max="<<a<<"min="<<b<<endl; //a已是大数,b是小数
return 0;
}
void swap(int *p1,int *p2) //函数的作用是将*p1的值与*p2的值交换
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
程序运行结果:
45 78↙
max=78 min=45
我们发现,原本实参到形参单向的值传递似乎发生了改变,在swap中改变了*p1和*p2的值,影响到了a和b的数值,这是为什么呢?
因为使用指针类型的变量作为函数参数时,实参向形参传递的是一个地址,此时,形参和实参实际上都指向同一个内存中的空间,因此,通过引用形参来修改其所指向内存空间中的值时,也就同时修改了实参所指向内存空间中的值。
利用指针作为函数参数,可以达到其他类型无法达到的效果,即:通过调用函数使变量的值发生变化,在主调函数中使用这些改变了的值。
如果想通过函数调用得到n个要改变的值,可以采取下面的步骤:
(1)在主调函数中设n个变量,用n个指针变量指向它们;
(2)编写被调用函数,其形参为n个指针变量,这些形参指针变量应当与主调函数中的n个指针变量具有相同的基类型;
(3)在主调函数中将n个指针变量作实参,将它们的值(是地址值)传给所调用函数的n个形参指针变量,这样,形参指针变量也指向这n个变量;
(4)通过形参指针变量的指向,改变该n个变量的值;
(5)在主调函数中就可以使用这些改变了值的变量。
使用指针来作为函数参数通常可以用在我们需要主调函数获取调用函数多个结果的情况,由于函数返回值只能有一个,因此,我们可以使用指针类型的参数,将我们需要的结果用指针带回。
2.指针型函数
前面我们介绍过,所谓函数类型是指函数返回值的类型。在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。定义指针型函数的一般形式为:
类型说明符 *函数名(形参表){
/*函数体*/
}
其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。如:
int *ap(int x,int y){
/*函数体*/
}
表示ap是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。
【例7-13】本程序是通过指针函数,输入一个1~7之间的整数,输出对应的星期名。
#include<iostream.h>
#include "stdlib.h"
int main(){
int i;
char*day_name(int n);
cout<<"input Day No:\n";
cin>>i;
if(i<0) exit(1);
cout<<"DayNo:"<<i<<"-->"<<day_name(i)<<"\n";
return0;
}
char *day_name(int n){
staticchar *name[]={ "Illegal day",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"
};
return((n<1||n>7) ? name[0] : name[n]);
}
本例中定义了一个指针型函数day_name,它的返回值指向一个字符串。该函数中定义了一个静态指针数组name。name数组初始化赋值为八个字符串,分别表示各个星期名及出错提示。形参n表示与星期名所对应的整数。在主函数中,把输入的整数i作为实参,在printf语句中调用day_name函数并把i值传送给形参n。
day_name函数中的return语句包含一个条件表达式,n值若大于7或小于1则把name[0]指针返回主函数输出出错提示字符串“Illegal day”。否则返回主函数输出对应的星期名。