在现实生活中,“地址”指的是我们居住在某条街上的某个小区的某栋某楼某室:
而在计算机中,“地址”指的是一个、一些数据在内存中储存的位置。比如我们之前讲到的指针,它的作用就是指向一块“地址”。
往期提要:
1.初识C++
2.算法:冒泡排序的c++实现
3.c++简单字符输出机实例
4.c++里花样繁多的运算符
5.c++实现成绩排序
6.用c++绘制字符塔
/1.按值传递参数/
在c++中,函数可以拥有参数:
int add(int a,int b){ return a+b;}
但是如果我们要写一个用于交换两个int变量的函数呢?如果这么写:
void exchange(int a,int b){ int temp=a; a=b; b=temp;}
来试试:
#include using namespace std;void exchange(int a,int b);int main(){ int a=1,b=2; exchange(a,b); cout <" " <endl; return 0;}// 输出:// 1 2
为什么明明执行过交换了还是没有交换呢?这是因为c++中,参数只是传递进去值的一个拷贝,更改参数对原来的变量一点用都没有。
这样子改变传递进去的值原始的值不会更改的参数传递方式叫做“按值传递”。
/2.按引用传递参数/
那么,如果要实现改变传递进去的值可以改变原始的值的话,就要传入进去“原始值的一个引用”,改变值的引用可以改变原始的值,把按值传递改成按引用传递很简单,只需要在名字前加一个&就好了:
void exchange(int& a,int& b);void exchange(int& a,int& b){ int temp = a; a = b; b = temp;}
这样子,参数a和b就是原始值的一个引用了,这样再运行,得到的结果就是:
2 1
/3.按地址传递参数/
我们之前提过,数组的名称就是指向储存数组第一个元素的地址的指针:
int a[3] = {1,2,3};// 此时,a就是a[0]的地址// 数组是连续的储存在内存中的,我们可以新定义一个指针变量b值为a// 指针指向一块地址,用*获取里面的值// 指针进行加法运算用于指向下一块地址// 那么执行a++之后,a指向的是a[1]的地址// *用于获得地址里存储的值cout << *a << endl;int *b = a;b++;cout << *b << endl;
用在类型后加上*来把一个普通类型变为一个指针类型,所以如果需要按地址传递,就可以在参数名称前面加上*:
void power_list(int* list,int length,int power_num=2);int main(){ int a[10] = {0,1,2,3,4,5,6,7,8,9}; power_list(a,9,9); for (int i:a){ cout << i << " "; }}void power_list(int* list,int length,int power_num){ for (int i=0;i<=length;i++){ list[i] = pow(list[i],power_num); }}
需要注意的是,按地址传递也可以更改原始变量。所以exchange函数还可以这么写:
void exchange(int* a,int* b){ int temp = *a; *a = *b; *b = temp;}
注意,由于按地址传递需要传递地址,而地址是不能直接进行交换的,我们需要先用*提取出值,再交换。
由于传递的必须要是地址(一般定义的变量都是一个值),所以函数的调用也需要做一些改变。
/4.取地址运算符/
在把一个值传递给一个按地址传递的参数时,需要在值的前面加上一个&,这里的&不是引用的意思,而是“取地址运算符”,它用于获取在内存中存储这个值的位置,所以应该这样将a、b传递给exchange:
exchange(&a1,&b);
今天你学废了吗