【C++】c++之函数形参和实参

11 篇文章 0 订阅

c++之函数形参和实参

c++之函数形参和实参讲解

1、非地址型参数

在c++中实现模块化编程时,我们形成会遇到对自定义的函数模块传入参数的操作,即形参。这里主要讲解一个非地址型的形参。

不多说,先看代码:

 

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 void changeNumber(int num){
 6     num ++;
 7 }
 8 
 9 
10 int main(){
11     int num = 9;
12     //猜猜num的值是多少
13     changeNumber(num);
14     cout << "num = " << num << endl; 
15     return 0;
16 }

 

我们从上面的代码可以看到,我们通过一个函数模块对num的值进行了修改,但是最后的输出会是多少呢,是10还是9呢。

我们来看一下控制台的输出结果:

输出结果显示的9,而不是10,那么这是为什么呢,在这之前我们先看看函数体内部的值是多少。

我们可以看到函数体内部的num的值是10,而主函数内的num依旧是9,并没有改变。

这是因为,传入给changeNumber(num);函数模块的num是一个形参,因为,函数的返回值是一个void类型,也就是无类型,那么该函数模块只是执行函数模块内部的代码并不会返回任何的值。但是就是说,虽然都是一个叫做num的变量,但是在changeNumber(num);体内,num的作用域仅仅在函数模块体内有用,一旦函数模块执行完毕,那么num的作用域也就结束了。实际上是内存中有两块不同的内存空间,他们的变量名都是num,但是实际上的值确实不一样的。如下图所示:

从图中我们可以看到主函数和自定义函数模块中的num变量的内存地址是不一样的。

但是如果我们换一种写法那就是截然不同的结果。

看代码:

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 void changeNumber(int &num){ //修改的地方  加了一个&符号
 6     num ++;
 7     cout << &num <<" in the model : num = " << num << endl;
 8 
 9 }
10 
11 
12 int main(){
13     int num = 9;
14     //猜猜num的值是多少
15     changeNumber(num);
16     cout << &num << " num = " << num << endl;
17     return 0;
18 }

从代码中我们可以看到,我仅仅只是在changeNumber()函数模块的形参部分修改了一点点,也就是加了一个引用的符号,取地址的意思,这样的结果将是截然不同,

看运行结果图:

从结果图中,我们可以看到,主函数和函数模块内部的变量num都是同一个变量(内存地址一样就是一样的变量),且最终在主函数中的num和函数模块里面的num的值都发生了改变。

原因:在非数组型形参中,形参只是实参的一份拷贝,也就是说是一个局部变量,通过变量对该变量赋值改变其值,只是在一个局部作用域中对变量进行改变,但是全部的变量(变量名相同)并没有改变。但是数组型形参是与此不同。

2.地址型参数

当我们给自定义的函数模块传入的是一个数组时,那么传入的就是当前数组的第一个元祖的地址,因为在内存中,数组就是一串连续的地址空间。先来看一段代码:

#include <iostream>

using namespace std;

void changeNumber(int &num){
    num ++;
    cout << &num <<" in the model : num = " << num << endl;

}




void changeArray(int arrayInt[], int len){ //此时传入的是数组的第一个元素的地址,类似指针操作
    /*
    if(len > sizeof(arrayInt) / sizeof(int)){
        cout << "输入的数组大小越界。" << endl;
    }
    */for (int i=0; i < len;i++){
        arrayInt[i] = i;
    }
}



void printArray(int arrayyInt[], int len){
    /*
    cout << "len= " << len<<endl;
    cout << "sizeof(arrayInt) / sizeof(int)= " << sizeof(arrayInt) / sizeof(int) <<endl;//输出为1

    因为传入的数组是一个头元素的地址也即指针地址,所以只有单位长,也就是一个int单位长,所以得到的值为1
    在main函数体内得到的值为真实的数组的大小长度



    if(len > (signed)(sizeof(arrayInt) / sizeof(int)) ){  //前者是有符号整数,后者是无符号整数

        cout << "输入的数组大小越界。" << endl;
    }
    */
    //打印

    cout << "-----print-----" <<endl;
    for (int i=0;i<len;i++){
        cout << arrayyInt[i] <<endl;
    }
    cout << "-----print-----" <<endl;
}

int main()
{

    int arrayInt[5]{2,4,55,23,1};//原始数组的数值
    cout << "原始输出:" <<endl;
    cout << "arrayInt=" <<endl;
    printArray(arrayInt,5);
    //开始改变

    changeArray(arrayInt,sizeof(arrayInt) / sizeof(int));
    cout << "改变之后:"<<endl;
    cout <<"arrayInt=" <<endl;
    printArray(arrayInt,sizeof(arrayInt) / sizeof(int));
    return 0;
}

运行结果如图所示:

从图中可以看到,同样的操作,对于int型的整数num和对于只能存放int型的数组来讲,c++对其做的改变是不一样的。这里对形参的操作其实也是对实参的操作,因为如果对数组实参进行一份拷贝的话,会增加很大的内存消耗,所以c++就直接修改了实参值。

当然对于数组的操作,还有一种指针的传参方式,先看代码:

1 void printPointArray(int* arrayInt,int len){
2     for(int i=0;i<len;i++){
3         cout << *(arrayInt+i) << endl;
4     }
5 }

从代码中我们看到,我们只是修改了打印数组的一个自定义函数,数组的参数传递有两种方式,一种是指针的方式:void printPointArray(int* arrayInt,int len),另一种是数组的方式:void printArray(int arrayInt[],int len),不管哪一种,都是传入一个数组的首地址。

 

posted @ 2019-03-24 13:00 东京的樱花在巴黎飘下 阅读(...) 评论(...) 编辑 收藏

  • 30
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值