函数名称还需要取地址吗_c++按值、地址、引用传递参数

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

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

    今天你学废了吗b2b2a423d6e9599ac99f588935d64064.pnga110fb907737a8dfc6df89514e532af8.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值