码迷,mamicode.com
首页 > 其他好文 > 详细

const 值传递和引用传递

时间:2017-04-16 23:48:23      阅读:396      评论:0      收藏:0      [点我收藏+]

标签:调用   内存   ext   用法   out   修改   wap   target   img   

const关键字,我们用const修饰的变量表明该变量的值以后不可以修改,即相当于常亮,并且在定义的时候应当初始化。

如:const int n = 0;

这和 int const n = 0;是等价的

extern修饰:extern的原理很简单,就是告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要放行!”

所以和一般的extern用法没有区别:

file1

extern const int n = 1; //定义并初始化

file2

extern const int n; //声明。然后可以使用

指针:

const int *p,说明p是一个指向int类型const对象的指针,即p指向的对象的值为const不可以进行修改,而p本身可以修改指向另一个int const。

const对象的地址赋值给不是指向const指针也是不行的,因为这样的指针可以通过*p修改指向的值,显然与const不可修改相矛盾。

const int *p;和int const *p;也是等价的

const指针:int *const p;不能修改指向的对象,但可以修改指向的对象的值

int n = 1;

int *const p = &n;

指向const对象的const指针:既不能修改指向的对象,也不能修改指向的对象的值

const int n = 1;

const int * cosnt p = &n;

下面就来看一下const在函数中的使用:用典型的swap来说明

void swap(int x, int y)
{
    int temp;
    temp = x;
    x = y;
    y = temp;
}

int main()
{
    int x = 1;
    int y = 2;
    swap(x, y);
    cout << x << " " << y << endl;
    system("pause");
    return 0;
}

输出:1 2这是典型的swap失败。因为是用的值传递。

我们来看一下这是为什么:

技术分享

主函数中的x y。

技术分享

swap函数中的x和y。可以看出和主函数中的地址完全不一样。因为这是值传递,即在调用swap的时候,将值传递给形参,而形参和实参是完全不一样的,占用的内存空间也不一样。所以在swap中交换并不影响实参。

void swap1(int &x, int &y)
{
    int temp;
    temp = x;
    x = y;
    y = temp;
}

然后我们来看一下c++中的引用传递。这样就很简单的实现了swap

void swap2(int* x, int *y)
{
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

//指向的位置不可以变
void swap3(int *const x, int *const y)
{
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

然后就是,很常规的通过指针来swap。

引用只是一个别名,与变量共享存储空间,并且必须在定义的时候初始化,而且不能再成为别的变量的别名。引用的底层就是用const指针来实现的

参考:

http://www.cnblogs.com/hustcat/archive/2009/04/11/1433549.html

http://blog.csdn.net/Sandeldeng/article/details/52916747

const 值传递和引用传递

标签:调用   内存   ext   用法   out   修改   wap   target   img   

原文地址:http://www.cnblogs.com/blog-lj/p/6720824.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!