首页 > 代码库 > 第五章 程序结构
第五章 程序结构
返回值
系统自动生成返回值的副本,该副本可以在程序中的返回点获得
函数原型声明
除非函数的定义在相同源文件的前面,否则必须使用函数原型声明(通常在#include和using之后):
#include <iostream>
using namespace std;
double power(double x,int y); //函数原型声明,形参可以和函数实现不同甚至只写double,int
int main()
{
x=power(y,z);
}
double power(double x1,int y1) //函数实现
{}
函数传递实参的两种形式:
一、形参是普通变量(不是引用)
1.按值传递机制
实参根本没有传递给函数,而是和实参具有相同值的副本传递给函数,所以函数的执行并不会影响实参:
int x=1;
int change(x);
不管change函数如何,int x都不会被改变
2.给函数传递指针实参
传递的是和实参指针存储相同地址的指针副本,因为指向的地址相同,所以可以改变被指向的地址
例:
void change(int*);
int main()
{
int x=10;
int* px=&x;
change(px);
cout<<*px<<endl;
}
void change(int* px)
{
*px+=10;
}
结果:
10
3.给函数传递数组
实质上是给函数传递指针,传递指针副本(编译器将数组名转换为指针)而不是数组副本(复制数组需要很大开销)
void change(int [],int);
int main()
{
int x[]={1,2,3,4,5};
int count=sizeof x/sizeof x[0];
change(x,count);
for(int i=0;i<count;i++)
{
cout<<x[i]<<" ";
}
}
//void change(int arrayx[],int count)
void change(int* arrayx,int count) //和上等价
{
for(int i=0;i<count;i++)
{
arrayx[i]+=1;
}
}
结果:2 3 4 5 6
4.多维数组
本地C++的多维数组的本质为数组的数组,所以传递的同样是指针副本(如二维数组传递的是指向第一行地址的指针副本)
例:
void change(int [][4],int);
int main()
{
int x[][4]={{1,2,3,4},{5,6,7,8}};
int count=sizeof x/sizeof x[0];
change(x,count);
for(int i=0;i<count;i++)
{
for(int j=0;j<4;j++)
{
cout<<x[i][j]<<" ";
}
cout<<endl;
}
}
void change(int arrayx[][4],int count)
//也可以写成void change(int (*arrayx)[4],int count)然后下面用++*(*(arrayx+i)+j);的形式,函数原型声明也要改成相应形式
{
for(int i=0;i<count;i++)
{
for(int j=0;j<4;j++)
{
++arrayx[i][j];
}
}
}
结果:
2 3 4 5
6 7 8 9
二、给函数传递引用实参
形参为实参的别名,消除的对实参的复制,允许函数直接访问调用函数中的实参
使用类类型的对象时很有用,因为复制很大的类的类对象要耗费很多时间
例:
void change(int&);
int main()
{
int x=10;
change(x);
int y=20;
change(y);
cout<<x<<" "<<y<<endl;
}
void change(int &x)
{
cout<<"receive"<<x<<endl; //输出的是值而不是地址
x++;
}
结果:
receive10
receive20
11 21
注:
引用的基本属性:声明并初始化引用之后,不能将其重新分配给另一个变量。但是这里美执行一次函数都初始化一个新的引用
本文出自 “flyclc” 博客,请务必保留此出处http://flyclc.blog.51cto.com/1385758/1540150