美文网首页
变量、指针、引用作为函数参数

变量、指针、引用作为函数参数

作者: 神奇的腿 | 来源:发表于2017-04-27 19:50 被阅读0次

先上测试代码:

#include<iostream>
using namespace std;

// 变量作为函数参数
void swap1(int a, int b) {
    int t;
    t = a;
    a = b;
    b = t;
}

// 指针作为函数参数
void swap2(int *a, int *b) {
    int t;
    t = *a;
    *a = *b;
    *b = t;
}

// 引用作为函数参数
void swap3(int &a, int &b) {
    int t;
    t = a;
    a = b;
    b = t;
}

// 指针的指针作为函数参数
void move1(int *a) {
    a = a+1;
}

void move2(int **a) {
    *a = *a+1;
}

int main() {
    int x(5), y(10);
    cout<<"变量作为函数参数:"<<endl
        <<"x="<<x<<", y="<<y<<"\nswap1: ";
    swap1(x,y);
    cout<<"x="<<x<<", y="<<y<<endl;

    int *px=&x, *py=&y;
    cout<<"\n指针作为函数参数:"<<endl
        <<"x="<<x<<", y="<<y<<"\nswap2: ";
    swap2(px,py);
    cout<<"x="<<x<<", y="<<y<<endl;

    cout<<"\n引用作为函数参数:"<<endl
        <<"x="<<x<<", y="<<y<<"\nswap3: ";
    swap3(x,y);
    cout<<"x="<<x<<", y="<<y<<endl;

    cout<<"\n指针的指针作为函数参数:"<<endl;
    int a[] = {1,2,3,4};
    int *pa = a;
    cout<<"a[0]: "<<a[0]<<endl
        <<"调用move1前*pa="<<*pa<<endl;
    move1(pa);
    cout<<"调用move1后*pa="<<*pa<<endl;
    move2(&pa);
    cout<<"调用move2后*pa="<<*pa<<endl;
}

输出为

变量作为函数参数:
x=5, y=10
swap1: x=5, y=10

指针作为函数参数:
x=5, y=10
swap2: x=10, y=5

引用作为函数参数:
x=10, y=5
swap3: x=5, y=10

指针的指针作为函数参数:
a[0]: 1
调用move1前*pa=1
调用move1后*pa=1
调用move2后*pa=2

swap1()

swap1()中开辟新的内存空间分配给a和b,并非别被赋值x、y,swap1()中a和b交换了值,但随着swap1()退出,a、b的内存空间被清理,并未改变x、y的值,因此交换值失败。

swap2()

swap2()用指针作为形参,传入的是x和y的地址,在swap内部直接对x和y进行操作,因此交换值成功。

swap3()

swap3()用引用作为函数形参,在swap内部并未开辟新的内存空间,是直接对x和y进行的操作,a和b只是相当于x和y的别名(可参见引用的定义),因此交换成功。

move1()

move1的本意是想改变指针,因此将指针输入move1(),但无奈move1()的形参是个指针,随着move1()退出,形参被从内存中清理,并没有影响pa,move失败。
(以下是复杂解释,可忽略。。。)
move1()用指针作为函数形参。指针pa表示开辟了一块内存用来存数组a首元素的地址。在move1()中,又开辟了一块新内存作为局部变量指针a,这个局部变量a被pa赋值,相当于局部变量a内存着数组a的首元素地址,即指针a指向数组a的首元素。move1()内部+1操作使得局部指针a指向数组a的第二个元素。但随着move1()退出,局部指针a被清理出内存,并没有影响到外部指针pa,因此move失败。

move2()

为改变指针pa,move2()用指针的指针作为形参,与swap2()异曲同工,真是可爱。

相关文章

  • 03_C++笔记_函数二

    函数指针: 内联函数: 引用 将引用变量作为参数(交换两个数的实现): 引用的属性和特别之处: 引用用于结构: 将...

  • 变量、指针、引用作为函数参数

    先上测试代码: 输出为 swap1() swap1()中开辟新的内存空间分配给a和b,并非别被赋值x、y,swap...

  • 指针函数,函数指针,和位运算

    1.函数指针和指针函数的区别 函数指针是指向函数的指针变量,即本质是一个指针变量 指针函数可用于将一个函数作为参数...

  • 【C++】指针传递与函数返回详解

    指针变量作为参数传递给函数的时候,编译器会将这个指针变量Copy一份,也就说在函数内部使用的这个参数变量,是另外一...

  • 对象作为函数参数的三种方式及推荐

    对象作为函数参数时有三种情况 一为 普通类作形参直接传递参数 二为引用类对象作为函数参数 三为对象指针作为函数参数...

  • 王道程序员求职宝典(十)函数,栈与队列

    函数 参数传递值传递指针传递引用传递指针引用*& 内联函数成员函数内联普通函数内联宏定义 默认参数从右向左设定默认...

  • Kotlin函数

    1.函数引用 kotlin中函数引用跟c++中的方法指针很相似,函数引用可以像其他类型的引用一样作为方法的参数和返...

  • Swift函数

    默认参数 可变参数必须是相同的类型 引用类型(指针的传递)1,默认情况下,函数的参数是值传递,如果想改变外面的变量...

  • golang学习笔记(七)复合类型

    复合类型 类型名称作为函数参数pointer指针值传递array数组值传递slice切片引用传递map字典引用传递...

  • GoAdvance

    指针 指针就是地址,指针变量就是存储地址的变量 *p : 解引用,间接引用 栈帧:用来给函数运行提供内存空间,取内...

网友评论

      本文标题:变量、指针、引用作为函数参数

      本文链接:https://www.haomeiwen.com/subject/goynzttx.html