函数-C++编程模块
给出一个基本的函数声明框架
函数参数与按值传递
对于一个函数而言,当它被调用时,参数都是按值传递的,也就是说传进去的只是一个副本,无论你对这个副本做任何修改都是对实际参数没有任何影响的。而在函数中声明的变量包括形参全部都是函数所私有的,被调用时,计算机为它们分配内存,当调用完毕时,计算机会释放这些内存。举个例子
#include <fstream>
#include <iostream>
using namespace std;
void cube(int x)
{
x = x*x*x;
cout << x << endl;
}
int main()
{
int x = 2;
cube(x);
cout << x << endl;
return 0;
}
输出结果:
8
2
但如果传进去的是一个引用或者指针,情况则大不一样,不信我们试试
#include <fstream>
#include <iostream>
using namespace std;
void cube(int& x)//void cube(int* x)
{
x = x*x*x;
cout << x << endl;//打印8
}
int main()
{
int x = 2;
cube(x);//cube(&x)
cout << x << endl;//打印8
return 0;
}
先说引用,引用只是一个别名,实际的主体只有一个,其中不涉及拷贝对象,从始至终就只有一个对象,所以形参作为引用是不占用内存空间的,因此你对这个形参的任何操作都会反映到实参上去。指针的话很简单,你传进去的是一个地址值,这个地址值不管你复印多少个它始终是一个地址,就好比你门牌号不管复印多少个,最终房子只有一个,所以你传进去的指针它指向的内存是不会变的,那么你通过指针间接访问修改其实也是完全没有问题,符合预期的,因为这房子是真真实实存在的。
注:两个恒等式
arr[i]==*(arr+i)
&arr[i]==arr+i
指针和const
有三种指针,区别在于const的位置
const int*p;//指向常量的指针,即不能通过*p修改
int const *p;//指向常量的指针
const int*const p;//指针常量,即p本身不能修改
int* const p;//指向常量的常指针,即*p和p都不能被修改
例子
int x=3;
const int*p=&x;//ok
*p=4;//error,*p不是可修改的左值
cout<<*p<<endl;//display 3
x=4;//ok
cout<<*p<<endl;//display 4;
int*const q=&x;//ok
int y=8;
q=&y;//error,q不能被修改
函数和二维数组
int data[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};//一个二维数组
int total=sum(data,3);//error
如果要计算这个二维数组的和,那么该如何传递这个参数?很显然data有三个元素,每个元素都是一个包含四个整数的一维数组。所以data类型是一个指向4个整数的数组的指针,正确的原型如下:
int sum(int (*p)[4],3);//第一种
int sum(int p[][4],3);//第二种
二维数组元素访问和指针的关系
arr[3][4]=*(*(arr+3)+4);
函数与结构
主要涉及函数的按值传递和按地址传递,由于按值传递涉及到拷贝,所以一旦结构体过大,那么拷贝所带来的花销也就更大,因此按地址传递才是比较合理的选择,传进一个指针,然后用指针来访问内部成员。