前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 传递动态内存

C++ 传递动态内存

作者头像
chaibubble
发布2018-01-02 11:51:47
7940
发布2018-01-02 11:51:47
举报

这部分内容在引用作为函数的参数这个blog中有一些涉及,为了讨论引用传递顺带了参数传递与指针传递,在这里从动态内存传递的角度梳理一下,先看这样一个题目: 下面五个函数中,哪些函数能够实现值的交换?

代码语言:javascript
复制
#include "iostream"    

using namespace std;

void swap1(int ,int);
void swap2(int* ,int*);
void swap3(int* ,int*);
void swap4(int *,int*);
void swap5(int &,int&);
int main()
{
    int i =3,j = 5;
    //swap1(i,j);
    //swap2(&i,&j);
    //swap3(&i,&j);
    //swap4(&i,&j);
    //swap5(i,j);
    cout<<i<<endl<<j<<endl;
    getchar();
    return 0;
}
void swap1(int a,int b)
{
    int temp;
    temp = a;
    a =b;
    b= temp;
}
void swap2(int *a,int *b)
{
    int *temp;
    *temp = *a;
    *a =*b;
    *b= *temp;
}
void swap3(int *a,int *b)
{
    int *temp;
    temp = a;
    a =b;
    b= temp;
}
void swap4(int *a,int *b)
{
    int temp;
    temp = *a;
    *a =*b;
    *b= temp;
}
void swap5(int &a,int &b)
{
    int temp;
    temp = a;
    a =b;
    b= temp;
}

(1)swap1函数显然不能,不解释了。

(2)swap2函数传的是一个地址,形参a,b是指向i,j的地址,函数内在做地址内值的交换,而不是做指向的交换,函数执行完后a还指向i,b还指向j,但是i,j地址内的值已经换了,这样来看的话貌似没啥问题,但是这个函数的代码写错了:

代码语言:javascript
复制
    int *temp;
    *temp = *a;

定义了指针temp,而在执行*temp = *a;的时候,想要把指针指向的值赋值给temp指向的值,但是temp在定义的时候没有指向任何地址,也就是它是一个空指针,但是我们又硬要给一个不存在的内存赋值,此时系统就会给一个随机地址,但是这个随机地址在函数结束的时候不会收回,这就造成了内存泄漏。 而且swap2的代码在vs2010里无法运行,编译没问题但是报异常,既然是由于上面的原因,那么我们就在temp定义的时候初始化它呗,这样temp就有了指向的内存:

代码语言:javascript
复制
void swap2(int *a,int *b)
{
    int  c;
    int *temp=&c;
    *temp = *a;
    *a =*b;
    *b= *temp;
}

(3)我们先跳过swap3直接看swap4,此时temp是个int型变量,a,b还是指向i,j的指针,然后我们发现,它还是在修改指针指向的地址内的值,也就是和swap2的交换没啥区别,唯一的区别在于: swap2存的值在temp指针指向的地址中,用*temp取值; swap4存的值就是temp变量。 前者多此一举。

(4)swap3中a,b分别是指向i,j的指针,在函数中完成了指针指向的交换,就像这样:

这里写图片描述
这里写图片描述

它确实实现了指向的交换,但是这并没有什么用,a,b本来就是函数的局部变量,再怎么改也不会影响i,j。

(5)直接参考引用的blog就好了,和之前的重复了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-08-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档