代码之家  ›  专栏  ›  技术社区  ›  augustin

C++:使用指针是“好主意”(TM)的场景是什么?[副本]

  •  16
  • augustin  · 技术社区  · 14 年前

    可能重复:
    Common Uses For Pointers?

    我仍然在学习C++基础知识,但是我已经知道足够做有用的小程序了。

    我理解指针的概念,我在教程中看到的示例对我来说很有意义。然而,在实践层面上,作为一名(前)PHP开发人员,我还没有信心在我的程序中实际使用它们。

    事实上,到目前为止 使用任何指针。我有我的类和函数,我似乎做得很好,没有使用任何指针(更不用说指针到指针)。我不禁为我的小节目感到骄傲。

    C++最重要的特性之一 ,这是一个双刃剑:指针和内存管理会造成破坏,看似随机的崩溃,难以发现的漏洞和安全漏洞。。。但同时, 如果使用得当,它们必须允许聪明高效的编程 .

    是什么 好的情景 哪里必须使用指针?
    他们允许你做什么你不能做的事?
    怎样才能让你的项目更有效率?

    指针指向指针呢???

    [编辑:所有的答案都是有用的。一个问题是,我们不能“接受”不止一个答案。我经常希望我能。事实上,所有的答案结合在一起有助于更好地理解整个情况。谢谢。】

    11 回复  |  直到 7 年前
        1
  •  6
  •   JoshD    14 年前

    指针在C++中常用。与他们相处融洽,将有助于您理解范围更广的代码。也就是说,如果你能避开它们,那就太好了,然而,随着你的程序变得越来越复杂,你很可能需要它们,即使只是为了与其他库接口。

    • new ).

    • 在嵌入式编程中,它们被用来指硬件寄存器之类的东西,它们要求代码写入 非常 内存中的特定地址。

    • class B : public A {} . 这是对象B的一个实例,通过将其地址提供给指向类A的指针,可以像访问类A一样访问该实例,即: A *a = &b_obj;

    • 如果您需要与C代码接口,您将始终需要处理用于引用动态分配对象的指针,因为 参考文献。C字符串只是指向以nul'\0'字符结尾的字符数组的指针。

    main() . 这通常声明为 char *argv[] ,但我看到它宣称(法律上我相信)是 char **argv

    声明是C风格的,但是它说我有指向指向char的指针的数组。它被解释为C样式字符串(以nul'\0'字符结尾的字符数组)的任意大小的数组(大小由argc携带)。

        2
  •  9
  •   Benjamin Lindley    14 年前

    当我想让一个类访问一个对象时,我使用指针,而不给它该对象的所有权。即使这样,我也可以用参考资料, 除非 我需要能够更改我正在访问的对象和/或不需要对象选项,在这种情况下指针将为空。

        3
  •  7
  •   Community CDub    7 年前

    This question has been asked on SO before . 我的回答是:

    • 当我需要动态创建一个其生存期超过其创建范围的对象时。
    • 当我需要分配一个在编译时大小未知的对象时。
    • 当我需要将一个对象的所有权从一个对象转移到另一个对象而不实际复制它时(比如在一个链表/堆/任何真正大而昂贵的结构中)
    • 当我需要从两个不同的地方引用同一个对象时。
    • 当我需要在不复制数组的情况下对数组进行切片时。
    • compiler intrinsics 生成特定于CPU的指令,或处理编译器发出次优或纯代码的情况。
    • 当我需要直接写入特定的内存区域时(因为它有内存映射IO)。
        4
  •  4
  •   Jerry Coffin    14 年前

    也就是说,指针有助于提高编程效率的主要方法之一是避免复制实际数据。例如,假设您正在编写网络堆栈。您将收到一个要处理的以太网数据包。您将数据从“原始”以太网驱动程序向上依次传递到IP驱动程序、TCP驱动程序(例如,HTTP驱动程序)和处理它包含的HTML的程序。

    之前 实际上你已经开始渲染了。

        5
  •  2
  •   Jason Iverson    14 年前

    指针的一个重要用途是动态调整数组大小。当您在编译时不知道数组的大小时,您将需要在运行时分配它。

    int *array = new int[dynamicSize];
    

    如果你解决这个问题的方法是 std::vector

        6
  •  2
  •   Philipp    14 年前

    有几种情况需要指针:

    • 可以将指向缓冲区的指针传递给从文件读取的方法等。
    • 您需要在堆上分配大量内存。

    从一开始就关心记忆问题是件好事。所以,如果你开始使用指针,你不妨看看智能指针,比如boost的shared_ptr。

        7
  •  2
  •   Manoj R    14 年前

    What are good scenarios where using pointers is a must?
    采访。执行strcpy。

    What do they allow you to do that you couldn't do otherwise?
    继承层次结构的使用。像二叉树这样的数据结构。

    In which way to they make your programs more efficient?

    And what about pointers to pointers???
    一个经常被问到的面试问题。如何在堆上创建二维数组。

        8
  •  1
  •   Arun    14 年前

    指针有一个特殊的值, NULL ,引用不会。我在任何地方都使用指针 是一个有效且有用的值。

        9
  •  1
  •   user34537 user34537    14 年前

    我只想说我很少使用指针。我使用引用和stl对象(deque、list、map等)。

     List<char*>* fileToList(char*filename) { //dont want to pass list by value
     ClassName* DataToMyClass(DbConnectionOrSomeType& data) { 
     //alternatively you can do the below which doesnt require pointers
     void DataToMyClass(DbConnectionOrSomeType& data, ClassName& myClass) { 
    

    这几乎是我使用的唯一情况,但我并没有那么难思考。如果我想要一个函数修改一个变量而不能使用返回值(比如说我需要更多的变量)

     bool SetToFiveIfPositive(int**v) {
    
        10
  •  0
  •   Mateen Ulhaq    14 年前

    它们是非常重要的数据结构。

        11
  •  0
  •   Eric Z    14 年前

    至于指针指向指针,这里有一个“hello world”示例,向您展示如何使用它。

    #include <iostream>
    
    void main()
    {
        int i = 1;
        int j = 2;
    
        int *pInt = &i;                 // "pInt" points to "i"
    
        std::cout<<*pInt<<std::endl;    // prints: 1
    
        *pInt = 6;                      // modify i, i = 6
    
        std::cout<<i<<std::endl;        // prints: 6
    
        int **ppInt = &pInt;            // "ppInt" points to "pInt"
    
        std::cout<<**ppInt<<std::endl;  // prints: 6
    
        **ppInt = 8;                    // modify i, i = 8
    
        std::cout<<i<<std::endl;        // prints: 8
    
        *ppInt = &j;                    // now pInt points to j
    
        *pInt = 10;                     // modify j, j = 10
    
        std::cout<<j<<std::endl;        // prints: 10
    }