C++ 传递动态内存

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

#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地址内的值已经换了,这样来看的话貌似没啥问题,但是这个函数的代码写错了:

    int *temp;
    *temp = *a;

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

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就好了,和之前的重复了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏极客猴

彻底理解Iterable、Iterator、generator

我们一般称 Iterable 为可迭代对象。Python 中任意的对象,只要它定义了可以返回一个迭代器的 __iter__ 方法,或者定义了可以支持下标索引的 ...

682
来自专栏Java 源码分析

Java8新特性

1.HashMap 首先就是对 java 的 HashMap 进行了修改,以前是通过 hashCode 方法来判断他们的地址值是否一样 ,如果相同的话再使用 e...

3124
来自专栏一个会写诗的程序员的博客

第5章 函数与函数式编程第5章 函数与函数式编程

函数式编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以传入函数参数,也可以返回一个函数。函数式编程 (简称FP) 是一种编程...

531
来自专栏Crossin的编程教室

可变对象与不可变对象

前阵子我们聊了下函数的参数传递以及变量赋值的一些内容:关于函数参数传递,80%人都错了。

1112
来自专栏Spring相关

带返回值的函数,闭包,沙箱,递归详解

那了解了函数 this 指向的不同场景之后,我们知道有些情况下我们为了使用某种特定环境的 this 引用, 这时候时候我们就需要采用一些特殊手段来处理了,例如...

302
来自专栏北京马哥教育

烦透了的Python装饰器,终于用这12点理清楚了

本文转自互联网,作者Dzone,感谢作者的辛苦付出和贡献。 Python的装饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Desig...

3705
来自专栏鸿的学习笔记

Python和Scala的一等函数

函数指的是执行某个任务或者是一系列的指令被组织成的一片代码块。标准的数学意义上的函数指的是输入集合和输出集合的一种对应关系。

521
来自专栏猿人谷

C++重要知识点小结---1

1.C++中类与结构的唯一区别是:类(class)定义中默认情况下的成员是private的,而结构(struct)定义中默认情况下的成员是public的。 2....

1799
来自专栏编程

C语言编程精华——《指针》

C语言编程精华--《指针》 使用指针有两方面的优势: 1、用指针能够更好完成某些任务; 2、有些任务只能是用指针才能够完成。 一、指针定义 1、计算机的内存 计...

1740
来自专栏Coco的专栏

一道面试题引发的对javascript类型转换的思考

对于一个好奇的切图仔来说,忍不住动手尝试了一下,看到题目首先想到的是会用到高阶函数以及 Array.prototype.reduce()。

2284

扫码关注云+社区