当前位置:   article > 正文

按值传递和按引用传递的区别_c++按值、地址、引用传递参数

图片展示c++引用和参数、地址传递区别

    在现实生活中,“地址”指的是我们居住在某条街上的某个小区的某栋某楼某室:

512c96587c6070c4ec87895531dea21c.png

    而在计算机中,“地址”指的是一个、一些数据在内存中储存的位置。比如我们之前讲到的指针,它的作用就是指向一块“地址”。

    往期提要:

        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);

    今天你学废了吗25e64938334e7d01529656c2eff3944c.png182cead9ba5a7358c15453eb98cbbdb5.png

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号