Why use double indirection? or Why use pointers to pointers?

前端 未结 18 2330
失恋的感觉
失恋的感觉 2020-11-22 10:37

When should a double indirection be used in C? Can anyone explain with a example?

What I know is that a double indirection is a pointer to a pointer. Why would I ne

18条回答
  •  忘掉有多难
    2020-11-22 11:40

    1. Basic Concept -

    When you declare as follows : -

    1. char *ch - (called character pointer)
    - ch contains the address of a single character.
    - (*ch) will dereference to the value of the character..

    2. char **ch -
    'ch' contains the address of an Array of character pointers. (as in 1)
    '*ch' contains the address of a single character. (Note that it's different from 1, due to difference in declaration).
    (**ch) will dereference to the exact value of the character..

    Adding more pointers expand the dimension of a datatype, from character to string, to array of strings, and so on... You can relate it to a 1d, 2d, 3d matrix..

    So, the usage of pointer depends upon how you declare it.

    Here is a simple code..

    int main()
    {
        char **p;
        p = (char **)malloc(100);
        p[0] = (char *)"Apple";      // or write *p, points to location of 'A'
        p[1] = (char *)"Banana";     // or write *(p+1), points to location of 'B'
    
        cout << *p << endl;          //Prints the first pointer location until it finds '\0'
        cout << **p << endl;         //Prints the exact character which is being pointed
        *p++;                        //Increments for the next string
        cout << *p;
    }
    

    2. Another Application of Double Pointers -
    (this would also cover pass by reference)

    Suppose you want to update a character from a function. If you try the following : -

    void func(char ch)
    {
        ch = 'B';
    }
    
    int main()
    {
        char ptr;
        ptr = 'A';
        printf("%c", ptr);
    
        func(ptr);
        printf("%c\n", ptr);
    }
    

    The output will be AA. This doesn't work, as you have "Passed By Value" to the function.

    The correct way to do that would be -

    void func( char *ptr)        //Passed by Reference
    {
        *ptr = 'B';
    }
    
    int main()
    {
        char *ptr;
        ptr = (char *)malloc(sizeof(char) * 1);
        *ptr = 'A';
        printf("%c\n", *ptr);
    
        func(ptr);
        printf("%c\n", *ptr);
    }
    

    Now extend this requirement for updating a string instead of character.
    For this, you need to receive the parameter in the function as a double pointer.

    void func(char **str)
    {
        strcpy(str, "Second");
    }
    
    int main()
    {
        char **str;
        // printf("%d\n", sizeof(char));
        *str = (char **)malloc(sizeof(char) * 10);          //Can hold 10 character pointers
        int i = 0;
        for(i=0;i<10;i++)
        {
            str = (char *)malloc(sizeof(char) * 1);         //Each pointer can point to a memory of 1 character.
        }
    
        strcpy(str, "First");
        printf("%s\n", str);
        func(str);
        printf("%s\n", str);
    }
    

    In this example, method expects a double pointer as a parameter to update the value of a string.

提交回复
热议问题