代码之家  ›  专栏  ›  技术社区  ›  Navaneeth Sen

需要指向指针的指针[重复]

  •  0
  • Navaneeth Sen  · 技术社区  · 15 年前

    可能重复:
    How do pointer to pointers work in C?

    大家好,

    我有一个非常基本的问题: C或C++中双指针的用法是什么?

    请有人用一些例子来解释一下。

    谢谢,

    6 回复  |  直到 9 年前
        1
  •  4
  •   Ed Swangren    15 年前

    如果要更改函数调用中原始指针指向的内容,则需要**。这是因为当您传递指针时,您传递的是指针的副本,即,如果您修改指针指向函数内部的内容(即,更改指针本身的值),它将反映在副本中,而不是原始副本中(不同于修改原始指针指向的内容,而不是完全指向新对象)。

    此外,多维数组可以通过指针指向指针(指向指针指向指针)来访问。。。无限期)。

        2
  •  2
  •   CashCow    15 年前

    常规数据指针是某个变量的地址。

    指针本身也是变量,因此具有地址,因此地址将是指针的指针。

    指针在C中比C++中使用更多,因为在C++中有一个使用引用的替代语法,以及许多指针被包装在类中而不直接使用的事实。

    在C中,下面的示例释放了指针中的结构,并将传入的指针设置为空。

    void FreeMyStruct( struct MyStruct ** ptr )
    {
       free((*ptr)->resource);
       free(*ptr);
       *ptr = NULL;
    }
    

    您可以对指针执行相同的操作,但如果将其设置为空,则对函数的调用方没有影响,因为它将是指针的副本,因此您将设置为空。

        3
  •  1
  •   Vovanium    15 年前

    C标准的En示例:

    long int strtol(
                    const char * restrict nptr,
                    char ** restrict endptr,
                    int base);
    

    …指向nal字符串的指针存储在endptr指向的对象中,前提是endptr不是空指针。

    如果主题序列为空或没有预期的表单,则不转换为 执行;nptr的值存储在endptr指向的对象中,前提是 该endptr不是空指针。

        4
  •  1
  •   fredoverflow    15 年前
    int main(int argc, char** argv);
    

    努夫说?;-)

        5
  •  1
  •   Bojan Komazec    15 年前

    函数体使用其参数的副本进行操作。所以当你想改变一些你作为函数参数传递的变量时,你实际上需要传递变量的地址——它的指针。函数获取指针的副本,该指针的地址为原始变量,因此函数可以更改变量的值。同样,当您想要更改某个指针的值时,您需要将其地址作为函数参数传递。

    典型的例子是函数需要为某些数据结构重新分配内存。在本例中,我们希望将一个字符数组传递到一个函数中,该函数在该函数中附加一个字符。函数需要为新的(扩展的)数组重新分配内存,这意味着它的指针需要指向内存中的新位置—它的值需要更改。注意给*pp(指向指针的非引用指针)赋值的行:

    #include <iostream>
    using namespace std;
    
    void append_char(char** pp, char ch)
    {
        // copy of pp is passed here
    
        if(pp)
        {
            if(*pp)
            {
                // pointer is already pointing to formed array of characters
    
                // 1. allocate memory for a new (extended) array 
                int nLen = strlen(*pp);
                // one place for ch and one for zero-termination 
                int nNewLen = nLen + 2;
                char* pNewStr = new char[nNewLen];
    
                // 2. copy existing array into a new one
                strcpy(pNewStr, (const char*)*pp);
    
                // 3. append new character
                pNewStr[nNewLen - 2] = ch;
                pNewStr[nNewLen - 1] = '\0';
    
                // 4. free memory of old array
                delete[] *pp;
    
                // 5. assign new pointer's value
                *pp = pNewStr;
            }
            else
            {
                // pointer is NULL - passed character will be the first in a new array
    
                // 1. allocate memory, fill the array and assign new pointer's value
                *pp = new char[2];          
                (*pp)[0] = ch;
                (*pp)[1] = '\0';
            }
        }
    }
    
    int main()
    {   
        char* p = new char[3];
        p[0] = 'A';
        p[1] = 'B';
        p[2] = '\0';
    
        cout << p << endl;
    
        append_char(&p, 'C');
    
        cout << p << endl;
    
        delete[] p;
    
        return 0;
    }
    

    我在这里使用C样式的字符串作为内存管理的常见示例。在C++代码中,尽量避免C字符串,并使用C++的CAST运算符。

        6
  •  0
  •   anirvan    15 年前

    我马上想到一件事-
    当使用“按指针传递”将指针传递给函数时,只会将指针的副本传递给函数。我们可以说“按指针传递”,它实际上是按值传递指针。在大多数情况下,这并不构成问题。但是,当您修改函数内部的指针时会出现问题。不是修改变量,而是只修改指针的副本,原始指针保持不变,也就是说,它仍然指向旧变量