• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 463
  • Last Modified:

pointer to pointer

What is the real-time advantage of pointer to pointer in C programming...
it just looks confusing to me...

i found this code online:

int **p;
      int *q;

      p = (int **)malloc(sizeof(int *));
      *p = (int *)malloc(sizeof(int));
      **p = 12;
      q = *p;

why do we use pointer to pointer....
0
perlperl
Asked:
perlperl
1 Solution
 
nixfreakCommented:
2 dimensional array is one common use.
0
 
Kent OlsenData Warehouse Architect / DBACommented:

Hi perlperl,

The example that you've given isn't very good in that it shows that you CAN use a dynamic pointer to a pointer, but not why.

Consider a program that loads several tables.  If you don't know how big the table is you have two choices.  A predefined table that is at least as large as the largest table you expect to load, or build a dynamic table.  Keeping huge tables lying around mostly unused is wasteful and inefficient so dynamic tables is often the better choice.

int **MakeIntTable (int columns, int rows)
{
      int **p;
      int *q;
      int idx;

      p = (int **)malloc(sizeof(int *) * rows);
      for (idx = 0; idx < rows; ++idx)
        p[idx] = (int *)malloc(sizeof(int) * columns);

      return p;
}

The function will create a table of integers of any size that we want.  The pointer-to-pointer structure is a pointer to an array of pointers.  The array of pointers contains pointers to arrays of integers that is the actual data that we want to store in the table.


Good Luck,
Kent

0
 
Infinity08Commented:
>> why do we use pointer to pointer....

Several situations ... Some examples :

1) a two-dimensional matrix :

        int **matrix = (int**) calloc(5, sizeof(int*));
        int i = 0;
        for (i = 0; i < 5; ++i) {
            matrix[i] = (int*) calloc(5, sizeof(int));
        }

    this creates a 5x5 matrix which can be accessed like this :

        matrix[3][2] = 22;

    note that you need to free the whole matrix :

        for (i = 0; i < 5; ++i) {
            free(matrix[i]);
        }
        free(matrix);



2) to pass an array to a function, that will be changed by the function :

        void fun(int **arr_ptr) {
            *arr_ptr = (int*) calloc(5, sizeof(int));
            int i = 0;
            for (i = 0; i < 5; ++i) {
                (*arr_ptr)[i] = i;
            }
            return;
        }

    call it like this :

        int *arr = 0;
        fun(&arr);
        /* the array has now been filled up with data by the function, and can be used */
        printf("%d\n", arr[2]);
        free(arr); /* clean up when the array is not needed any more */
0

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now