• 笔试被鄙视之细节问题一


    利用函数的形参传递变量

    在自己的印象中,利用一个指针变量作为形参就能够,函数执行后就能够更改此变量的值,一般来说这是正确的,但是忽略了前提条件,指针变量的空间开辟必须在传递参数之前,如果我硬要在函数中开辟呢?下面慢慢讲解,大神可飘过,不熟练的看看,菜鸟认真在编译器中实践一下。

    1.普通的正确形式

    void hello(int *a)
    {
        *a=5;
    }
    void main()
    {
        int i;//int *i=new int();
        hello(&i);//hello(i);
        cout<<i;//cout<<*i;
    }

    开始之前就i就有了自己的空间,不解释。

    2.没有在传参之前开辟空间,而在函数内部开辟空间

    void hello(int *a)
    {
        a=(int*)malloc(sizeof(int));
        *a=5;
    }
    void main()
    {
        int *i=NULL;
        hello(i);
        cout<<*i;
    }

    程序会报错,cout<<*i;这步出错,访问异常,这是为什么呢?开始时i的地址是空的,利用(int *a)传递i实际上相当于执行了int *a=i,只是单纯的给a赋值,而没有实际的进入函数内部,故hello执行完之后i始终是NULL,所以会出错。有人可能会注意到,用引用会不会也会出现这种问题呢,我们用引用引用的一般都是对象,对象时开辟好空间的,不会出现这种问题,不信可以自己改了试试。

    3.没有在传参之前开辟空间,而在函数内部开辟空间,采用指针的指针或指针的引用(我把指针地址的地址传进去不就可以了么)

    void hello(int **a)//指针的指针
    {
        *a=(int *)malloc(sizeof(int));
        **a=4;

    }
    void main()
    {
        int *i=NULL;
        hello(&i);
        cout<<*i;
    }

    void hello(int* &a)//指针的引用
    {
        a=(int*)malloc(sizeof(int));
        *a=4;

    }
    void main()
    {
        int *i=NULL;
        hello(i);
        cout<<*i;
    }

    注意使用方式。

    当然了我这里所列举的是简单的小例子,也算浅显易懂,但这些变量换成了字符串,结构体等得融会贯通才行。

  • 相关阅读:
    css划隔横线的两种方法
    GET与POST方法的区别
    前端常用技巧整理
    结合个人经历总结的前端入门方法 (转自https://github.com/qiu-deqing/FE-learning)
    前端资源教程(转自 前端资源教程)
    如何在本地电脑安装phpmyadmin及访问地址
    鼠标放上去会变色的按钮
    Linux内核学习总结-linux内核学习笔记(九)
    进程调度和切换---linux内核学习笔记(八)
    可执行程序的装载和启动---linux内核学习笔记(七)
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3202775.html
Copyright © 2020-2023  润新知