Implementacja Tablicy Dwuwymiarowej Przy Użyciu Podwójnego Wskaźnika

Proszę wziąć pod uwagę następujący kod:

#include <stdio.h>
#include <stdlib.h>

#define NUM_ARRAYS     4
#define NUM_ELEMENTS   4
#define INVALID_VAL   -1

int main()
{
   int index            = INVALID_VAL;
   int array_index      = INVALID_VAL;
   int **ptr            = NULL;

   ptr = malloc(sizeof(int*)*NUM_ARRAYS);

   if (!ptr)
   {
      printf ("\nMemory Allocation Failure !\n\n");
      exit (EXIT_FAILURE);
   }

   for (index=0; index<NUM_ARRAYS; index++)
   {
      *(ptr+index) = malloc(sizeof(int)*NUM_ELEMENTS); 

      if (!*(ptr+index))
      {
         printf ("\nMemory Allocation Failure !\n");
         exit (EXIT_FAILURE);
      }
   }

   /* Fill Elements Into This 2-D Array */
   for (index=0; index<NUM_ARRAYS; index++)
   {
      for (array_index = 0; array_index<NUM_ELEMENTS; array_index++)
      {
         *(*(ptr+index)+array_index) = (array_index+1)*(index+1);
      }
   }

   /* Print Array Elements */
   for (index = 0; index<NUM_ARRAYS; index++)
   {
      printf ("\nArray %d Elements:\n", index);
      for (array_index = 0; array_index<NUM_ELEMENTS; array_index++)
      {
         printf (" %d ", *(*(ptr+index)+array_index));
      }
      printf ("\n\n");
   }

   return 0;
}
Nie ma problemu z moim kodem. Działa dobrze.
Output:

Array 0 Elements:
 1  2  3  4 


Array 1 Elements:
 2  4  6  8 


Array 2 Elements:
 3  6  9  12 


Array 3 Elements:
 4  8  12  16 

Mam pytanie odnośnie arytmetyki wskaźnika:

*(ptr+0) = Wskaźnik do zakończenia bloku (pierwsza tablica)
*(ptr+1) = Wskaźnik do zakończenia bloku (druga tablica).

Ale co to jest: (*ptr+1)?

Wyjście GDB:

(gdb) p *(*ptr+1)
$1 = 2
(gdb) p *(*ptr+2)
$2 = 3
(gdb) p *(*ptr+3)
$3 = 4
(gdb) p *(*ptr+4)
$4 = 0
Zaczynam się mylić. Proszę podać mi jakieś wyjaśnienie, aby rozwiązać tę wątpliwość.
Author: Sandeep Singh, 2012-12-20

4 answers

*(ptr+i) jest równa ptr[i] i *(ptr+1) jest ptr[1].

Można myśleć, tablica 2-D jako tablica tablicy.

  • ptr wskazuje na kompletną tablicę 2-D, więc ptr+1 wskazuje na następną tablicę 2-D.

Na rysunku poniżej ptr jest 2-D, A Liczba kolumn to 3

Oryginalna Figurka wykonana przez Pana Kerreka SB, tutaj , Warto również sprawdzić!

+===============================+==============================+====
|+---------+----------+--------+|+----------+---------+--------+|
||ptr[0,0] | ptr[0,1] | ptr[0,2]|||ptr[1,0] |ptr[1,1] | ptr[1,2]|| ...
|+---------+----------+--------+++----------+---------+--------++ ...
|            ptr[0]             |           ptr[1]              |
+===============================+===============================+====
   ptr

*(*ptr+1) = *( ptr[0] + 1 ) = ptr[0][1]

Zrozum co następuje:

ptr punkty do complete 2-D.

*ptr = *(ptr + 0) = ptr[0] to pierwszy rząd.

*ptr + 1 = ptr[1] oznacza drugi rząd

*(*ptr+1) = *(*(ptr + 0) + 1 ) = *(ptr[0] + 1) = ptr[0][1]

Array 0 Elements:
1  2  3  4 

I wyjście GDB:

(gdb) p *(*ptr+1)
$1 = 2  

To jest poprawne 2 można to odczytać za pomocą ptr[0][1].

 9
Author: Grijesh Chauhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:56
                               (*ptr)   (*ptr+1)     (*ptr+2)
                                 |         |            |
             __________      ____v___ _____v_____ ______v____ __________
  ptr------>|   *ptr   |--->|*(*ptr) |*(*ptr+1)  |*(*ptr+2)  |          |
            |__________|    |________|___________|___________|__________|
 (ptr+1)--->| *(ptr+1) |     ____________ _____________ __________
            |__________|--->|*(*(ptr+1)) |*(*(ptr+1)+1)|          |
            |          |    |____________|_____________|__________|
            |__________|          ^             ^
                                  |             |
                              *(ptr+1)     *(ptr+1)+1

Tablica 2D z podwójnymi wskaźnikami oznacza to, że masz tablicę główną, a elementy tablicy głównej są wskaźnikami (lub adresami) do tablicy podrzędnej. Jak wskazano na powyższym rysunku

Więc jeśli zdefiniowałeś Podwójny wskaźnik jako wskaźnik tej tablicy 2D powiedzmy int **ptr

Więc ptr rozważa do tablicy głównej, która będzie zawierała wskaźniki do tablic podrzędnych. {[2] } jest wskazaniem na tablicę główną czyli ptr jest wskazaniem na pierwszy element tablicy głównej więc ptr + 1 wskazuje na drugi element tablicy głównej.

*ptr oznacza to zawartość pierwszego elementu, na który wskazuje ptr. I to jest wskaźnik do subarray. tak więc *ptr jest wskaźnikiem do pierwszej subarray (subarray jest tablicą int). więc *ptr wskazuje na pierwszy pierwiastek w pierwszym podprzestrzeni. tak więc *ptr + 1 jest wskaźnikiem do drugiego elementu w pierwszym podpunkcie

 24
Author: MOHAMED,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-20 15:15:06

Najprostszy sposób tworzenia tablicy dwuwymiarowej za pomocą wskaźnika, przypisywania wartości i dostępu do elementów z tablicy.

#include<stdio.h>
#include<stdlib.h>

int main()
{
int i,j;
int row,col;
printf("Enter the values for row and col:\n");
scanf("%d%d",&row,&col);
int **arr=(int**)malloc(row*(sizeof(int*)));
for(i=0;i<row;i++)
{
    *(arr+i)=(int*)malloc(sizeof(int)*col);
            //You can use this also. Meaning of both is same.
            //arr[i]=(int*)malloc(sizeof(int)*col);
}
for(i=0;i<row;i++)
for(j=0;j<col;j++)
{
    arr[i][j]=0;
}
for(i=0;i<row;i++)
{
    for(j=0;j<col;j++)
    {
        printf("%d ",arr[i][j]);
    }
    printf("\n");
}
}
 3
Author: Tonmoy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-17 16:22:00

O ile nie pomyliłeś znaków, (*ptr + 1) jest równoważne *(ptr + 0) + 1, które jest wskaźnikiem do drugiego elementu w pierwszym bloku.

 2
Author: MJZ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-30 16:16:54