C+基础学习-4

155 阅读3分钟

Warning: 自家学习专用__by Arthur

函数参数的使用

脑子里只有按值传递和按引用传递的概念,但并未深究,经从网上收集资料整理,以帮助记忆。

按值传递

传入的为实参的副本(可理解为“影分身术”),因此函数体内对形参的操作,对本体是没有没有影响的(虽然Naruto能够感知影分身),如:

        void swap1(int, int);        //函数声明,交换两个int的值
        void swap1(int a, int b)     //函数定义
        {
            int temp = a;
            a = b;
            b = temp;
        }
        int main()
        {
            int p = 110;
            int q = 119;
            swap1(p, q);
            std::cout << p << "," << q << std::endl; 
            return 0;
        }
        //结果:110   119 
        //a,b的值并未交换,传入的为“影分身”

按引用传递

要明白什么是引用,就是为一个对象起了一个别名,就像你的大名和乳名一样,不管别人喊哪一个名字,都是指本体,因此函数体内的对形参的改变时刻回影响到本体,如

        void swap2(int&, int&);         //函数声明
        void swap2(int& a, int& b)
        {
            int temp = a;
            a = b;
            b = temp;
        }
        int main()
        {
            int p = 110;
            int q = 119;
            swap2(p, q);
            std::cout << p << "," << q << std::endl; 
            return 0;
        }
        //结果:119, 110

指针作为函数参数--1

指针,意味着传入的是对象的地址,直接上代码区别:

        void swap3(int*, int*);
        void swap3(int* a, int* b)
        {
            int temp = *a;      //解引用操作,获取对象的值,实际上还是对本体操作
            *a = *b;
            *b = temp;
        }
        int main()
        {
            int p = 110;
            int q = 119;
            swap3(&p, &q);
            std::cout << p << "," << q << std::endl; 
            return 0;
        }
        //结果:119, 110
        //还是交换了值,因为函数体内部实际上还是对本体进行操作

指针作为函数参数--2

函数体内部对对象地址进行操作,区别于Demo-3,如:

        void swap4(int*, int*);
        void swap4(int* a, int* b)
        {
            int *temp = a;          //定义了一个指针对象,函数体体内对地址进行操作      
            a = b;
            b = temp;
        }
        int main()
        {
            int p = 110;
            int q = 119;
            swap4(&p, &q);
            std::cout << p << "," << q << std::endl; 
            return 0;
        }
        //结果:110, 119
        //并没有交换地址,原因在于:在main函数体内定义了两个变量p和q,此时,p和q就是内存块(p->pBuffer-p,q->qBuffer)的别名,,里面的值分别为110和119,即使swap4函数想要通过地址p和q交换两个对象,内存块的名字没变,存储的值也没变,因此通过p和q并没有交换值。

数组作为函数参数

需要明白的是,数组名本身就是指一块内存的首地址,于指针的作用相当,如

        int array[3] = {0}      //定义并初始化一个3维数组,初始值为0;
        int* pArr = array;      //等价于:int* pArr = array[0]
        
        void swap5(int array[]);    //等价   void swap5(int* array);