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

相关文章

  • 算法-字符串替换空格

    题目: 实现一个函数,把字符串中的每一个空格替换成”%20”。例如输入”We are happy.”,则输出”We%20are%20happy.”。 解题思...

    chaibubble
  • OpenCV 3.1 imwrite()函数写入异常问题解决方法

    最近配置了OpenCV3.1版本,按照2.x的习惯写了一个保存图片的代码(测试证明该代码在2.4.11下运行正常),但是在使用imwrite()函数的时候出现了...

    chaibubble
  • 算法-删除字符串中的公共字符

    题目: 输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入“They are students.”和”aeiou”,则删除之后的第一个字...

    chaibubble
  • 每日一题(8)

    解析: java在处理自增自减时,会使用临时变量存储,计算后再返回该值 自增自减原理一样,此处以自增为例

    KEN DO EVERTHING
  • 马走日(bfs)

    题目 江湖是什么,对于在象棋界厮杀的大钉来说, 江湖就是一个矩阵,他的目标,就是在江湖之中骑着马,从他的位置出发,走到终点。

    用户4492257
  • 疯子的算法总结(五) 矩阵乘法 (矩阵快速幂)

    学过线性代数的都知道矩阵的乘法,矩阵乘法条件第为一个矩阵的行数等与第二个矩阵的列数,乘法为第一个矩阵的第一行乘以第二个矩阵的第一列的对应元素的和作为结果矩阵的第...

    风骨散人Chiam
  • 洛谷P1962 斐波那契数列(矩阵快速幂)

    题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n...

    attack
  • 算法系列之二进制位+回溯递归

    题目:从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。输入:n 输出:多种方案 同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。

    公众号guangcity
  • 【leetCode】斐波那契数列day06

    https://leetcode-cn.com/problems/fei-bo-na-qi-shu-lie-lcof/

    居士
  • 美国的面部识别“危机”

    总部位于波士顿的非营利组织Fight for the Future宣布,将与倡导团体Students for Sensitive Drug Policy合作,努...

    AiTechYun

扫码关注云+社区

领取腾讯云代金券