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ść. 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ęcptr+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]
.
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
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");
}
}
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.
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