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 条评论
登录 后参与评论

相关文章

来自专栏测试开发架构之路

C++之面向对象的三个基本特征

三大特性是:封装,继承,多态   所谓封装 就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.封装是面...

2696
来自专栏Vamei实验室

Python标准库13 循环器 (itertools)

在循环对象和函数对象中,我们了解了循环器(iterator)的功能。循环器是对象的容器,包含有多个对象。通过调用循环器的next()方法 (__next__()...

1738
来自专栏小白的技术客栈

Python内置数据结构之集合

今天给大家介绍内置数据结构集合的用法。 看一下集合的思维导图: ? 集合的特点 元素是唯一的 元素是无序的,不是线性结构 集合元素是可hash的 聚合的含义和数...

3404
来自专栏python3

python3--函数初识

函数能提高应用的模块性,和代码的重复利用率。已经知道python提高了许多内建函数,比如print(),len()等。但你也可以自己创建函数,这被叫做用户自定义...

821
来自专栏java一日一条

JavaScript 易错知识点整理

本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由...

451
来自专栏程序员互动联盟

【答疑释惑】C语言常犯语法错误

1 字符常量与字符串常量混淆。 char c; c="a"; 在这里就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引...

25210
来自专栏hbbliyong

python 函数参数的传递(参数带星号的说明)

python中函数参数的传递是通过赋值来传递的。函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析 先看第一个...

3198
来自专栏nummy

itertools模块详解

tee()创建的迭代器共享其输入迭代器,所以一旦创建了新迭代器,就不应该再使用远迭代器。

843
来自专栏everhad

算法:排序

一些约定 java命令行程序 算法的学习和语言无关,下面使用一个java命令行程序来作为实例程序。 一个算法一个类 排序算法使用一个方法就可以表示,不需要是...

1736
来自专栏Python爬虫实战

Python指南:组合数据类型

Python提供了5中内置的序列类型:bytearray、bytes、list、str与tuple,序列类型支持成员关系操作符(in)、大小计算函数(len()...

501

扫码关注云+社区