一、函数的定义
1.函数定义的一般形式
数据类型 函数名(形参表)
{
函数体 //执行语句
}
注:(1)返回值类型,若数据类型为void,则无返回值
(2)(int x,y)错误,形式参数类型必须一一说明
(3)形参表可以为空,但括号不可省
(4)函数名是标识符,一个程序除了主函数名必须为main之外,其余函数的名字按照取名规则任意选取
(5)函数不允许嵌套定义,但是允许嵌套使用
(6)函数只有被调用才能执行
典型结构:
第一部分:预处理指令
符号常量定义
函数声明
第二部分:主函数
第三部分:函数定义
2.函数形式
(1)无参函数:即为没有参数传递的函数,无参函数一般不需要带回函数值,所以函数类型说明为void
(2)有参函数:即为有参数传递的函数,一般需要带回函数值
(3)空函数:即函数体只有一对花括号,花括号内没有任何语句的函数
(空函数不完成什么工作,只占据一个位置,在大型程序设计中,空函数用于扩充功能)
二、函数的声明和调用
1.函数的声明
调用函数之前先要声明函数原型
如下形式:
类型说明符 被调函数名(含类型说明的形参);
原型声明与定义时的第一行类似,只是多了一个分号
下面对js()函数原型声明是合法的。
int js(int n);
也可以
int js(int);
2.函数的调用
函数名(实参列表);括号不能省略
实参列表中应给出函数原型形参个数相同、类型相符的实参。在主调函数中的参数成为实参,实参一般应具有确定的值。实参可以是常量、表达式,也可以是已有确定值的变量、数组或指针名。
函数调用可以作为一条语句,这时函数可以没有返回值。
函数调用也可以出现在表达式中,这时就必须有一个明确的返回值。
3.函数的返回值
return(表达式);
其功能是把程序流程从被调函数转向主调函数并把表达式的值带回主掉函数,实现函数的返回。所以,在圆括号表达式的值实际上就是该函数的返回值。其返回值的类型即为它所在函数的函数类型。
当一个函数没有返回值时,函数中可以没有return语句,直接利用函数体的右花括号“}”,作为没有返回值的函数的返回,也可以有return语句,但return后没有表达式。
返回语句的另一种形式是:
return;
这时函数没有返回值,而只是把流程转向主调函数。
C++中函数调用时的三中参数传递方式(实虚结合)
A:按值传递
参数传递方向只能是从实参到形参,简称单向值传递。
#include<bits/stdc++.h>
using namespace std;
void swap(int x,int y)
{
int tmp=x;x=y;y=tmp;
}
int main()
{
int a=1,b=2;
swap(x,y);
cout<<a<<" "<<b<<endl;
return 0;
}
运行结果:
a=1, b=2
a=1, b=2
将实参a, b的值分别拷贝给形参x, y,然后a, b就不再和swap有关了,swap交换的是x, y的值,但是x, y的作用域只在swap中,他们确实完成了交换,但是swap结束之后,x, y的值也就随之销毁了,所以根本不会对行参有任何影响,当然就不会实现实参的交换。
函数的传址调用——可返回两个以上变量的结果
这种调用方式是将实参变量的地址值传递给形参,这时形参是指针,即让形参的指针指向实参地址,这里不再是将实参拷贝一个副本给形参,而是让形参直接指向实参,这样便可以改变实参变量的值。
在说明变量时,前面加*代表定义指针变量。前面加&代表定义引用变量。
B 引用传递(最好用):类型名&引用名=某变量名;(&是取地址的标志,即取地址符)
某个变量的引用,和这个变量是一回事,相当于该变量的一个别名。
引用的概念:
int n=4;
int &r=n;
r=4;
cout<<r;//输出4
cout<<n;//输出4
n=5;
cout<<r;//输出5
定义引用时一定要将其初始化成引用某个变量,不初始化编译不过。
引用只能引用变量,不能引用常量和表达式。
#include<bits/stdc++.h>
using namespace std;
void swap(int &a,int &b)
{
int tmp=a;a=b;b=tmp;
}
int main()
{
int c=1,d=2;
swap(c,d);
cout<<c<<" "<<d<<endl;
return 0;
}//运行结果:c,d的值被交换
C 地址传递:类型标识符(目标变量类型,如int)*变量名(指针变量名,类型为无符号32位数)
*为指针说明符
指针变量:其内容为地址(存储地址)的变量,简称指针。它所指向的地址上存放的变量称作目标变量
指针变量同样可以赋值:
int i,*i_point;
i_point=&i;
也可以在定义指针变量时赋初值:
int i;
int *i_point=&i;
指针变量的引用
①
int main()
{
int a=10,b=100;
int *p1,*p2;
p1=&a;p2=&b;
cout<<a<<'\t'<<b<<endl;
cout<<*p1<<'\t'<<*p2<<endl;
}
②
int main()
{
int a,b;
int *p1,*p2;
p1=&a;p2=&b;
*p1=10;*p2=100;
cout<<a<<'\t'<<b<<endl;
cout<<*p1<<'\t'<<*p2<<endl;
}
但是不能对未赋值的指针变量做"取内容"运算。如下
int main()
{
int a,b;
int *p1,*p2;
*p1=10;*p2=100;
cout<<a<<'\t'<<b<<endl;
cout<<*p1<<'\t'<<*p2<<endl;
}
指针的运算
-int a[4];int*p=a;p++;
-int b=2;int *q=&b;p--;
+n(-n)
-int a[4];int*p=a;p+=2;
-int b=2;int *q=&b;p-=2;
指针变量作为函数参数:
指针变量作为函数参数与变量本身作函数不同, 变量作函数参数传递的是具体值,而 指针作函数参数传递的是 内存的地址。
输入a,b两个整数,按大小输出这两个数。
#include<bits/stdc++.h>
using namespace std;
int swap(int *p1,int *p2)
{
int t;
t=*p1;*p1=*p2;*p2=t;
}
int main()
{
int *point1,*point2,a,b;
cin>>a>>b;
point1=&a;point2=&b;
if(a<b)
swap(point1,point2);
cout<<"a="<<a<<",b="<<b<<endl;
cout<<*point1<<","<<*point2<<endl;
}
#include<bits/stdc++.h>
using namespace std;
int swap(int x,int y)
{
int t;
t=x;x=y;y=t;
}
int main()
{
int *point1,*point2,a,b;
cin>>a>>b;
point1=&a;point2=&b;
if(a<b)
swap(a,b);
cout<<"a="<<a<<",b="<<b<<'\n';
cout<<*point1<<'\t'<<*point2;
}
用指针变量作函数参数,在被调函数的执行过程中,应使指针变量所指向的参数值发生变化,这样,函数在调用结束后,其变化值才能保留回主调函数。
函数调用不能改变实参指针变量的值,但可以改变实参指针变量所指向变量的值。
用指针变量做函数参数,可以得到多个变化了的值。