zoukankan      html  css  js  c++  java
  • 对于在函数把指针做为参数传入的几点总结

    一.形如void Func(char* ptr)。

    注意这里传进去的是指针的副本,本质上是传值的方式。在函数内部新建一个指针变量,再把ptr指向的值赋给局部指针变量。对局部变量本身地址的任何修改都不会影响到ptr。

     1 int newInt=1;
     2 
     3 void ChangeLoc(int* ptr)
     4 {
     5 ptr=&newInt;
     6 }
     7 
     8 int main()
     9 {
    10 int num=2;
    11 int* ptr=#
    12 cout<<ptr<<endl;
    13 ChangeLoc(ptr);
    14 cout<<ptr<<endl;
    15 }
    16 
    17 /*
    18 结果:
    19 2
    20 2
    21 */

    二.如果要视图在局部变量中修改传入的形参的地址,可使用指针引用或指针的指针方法。

    出处:http://www.cnblogs.com/li-peng/

    使用指针的指针

    展示一下使用指针的指针做为参数

    复制代码
    void func(int **p)
    {
        *p = &m_value;
        // 也可以根据你的需求分配内存
        *p = new int;
        **p = 5;
    }
    
    int main(int argc, char *argv[])
    {
        int n = 2;
        int *pn = &n;
        cout << *pn << endl;
        func(&pn);
        cout << *pn <<endl;
        return 0;
    }
    复制代码

    我们看一下 func(int **p)这个方法

    • p:  是一个指针的指针,在这里我们不会去对它做修改,否则会丢失这个指针指向的指针地址
    • *p:  是被指向的指针,是一个地址。如果我们修改它,修改的是被指向的指针的内容。换句话说,我们修改的是main()方法里 *pn指针
    • **p: 两次解引用是指向main()方法里*pn的内容

    指针的引用

    再看一下指针的引用代码

    复制代码
    int m_value = 1;
    
    void func(int *&p)
    {
        p = &m_value;
    
        // 也可以根据你的需求分配内存
        p = new int;
        *p = 5;
    }
    
    int main(int argc, char *argv[])
    {
        int n = 2;
        int *pn = &n;
        cout << *pn << endl;
        func(pn);
        cout << *pn <<endl;
        return 0;
    }
    复制代码

    看一下func(int *&p)方法

    • p:  是指针的引用,main()方法里的 *pn
    • *p:是main()方法里的pn指向的内容。

    三.effective c++:条款31---千万不要返回局部对象的引用, 不要返回函数内部用new初始化的指针的引用

     1 char* out()
     2 {
     3 /*wrong*/
     4 
     5 /*version1
     6 char* array=new char[10];
     7 cin>>array;
     8 return array;
     9 */
    10 
    11 /*version2
    12 string k="hello,world";
    13 return k;
    14 */
    15 
    16 }
  • 相关阅读:
    ls命令输出文件的绝对路径
    grep命令用关系或查询多个字符串
    pthread_cond_timedwait
    移位运算溢出:右操作数须小于左操作数的位数
    Source Insight symbol not found
    break和continue能否跳出函数
    Oracle ORA-01033: ORACLE initialization or shutdown in progress 错误解决办法. 重启服务
    git bash中不能显示中文
    docker初探
    C++ STL常见数据结构(容器)分类
  • 原文地址:https://www.cnblogs.com/lsr-flying/p/4488945.html
Copyright © 2011-2022 走看看