Deklaracja wskaźnika do tablicy wielowymiarowej

Odpowiedz Nowy wątek
2017-08-12 21:01
0

Witam, uczę się języka C z książki "Język C - szkoła programowania" S Praty i mam malutki problem ze wskaźnikami.

Jestem aktualnie na "Wskaźnikach do tablic wielowymiarowych" i mam problem z deklaracją takich wskaźników. W książce jest napisane, że żeby zadeklarować zmienną wskaźnikową, która byłaby zgodna z np. tablicą dwuwymiarową, nie wystarczy wskaźnik do int, gdyż ten typ jest zgodny tylko ze zmienną, która wskazuje pojedynczą wartość int - zmienna wskaźnikowa powinna wskazywać na całą tablice takich wartości. Potem jest przykład deklaracji takiej zmiennej:

int (*wz)[2]; // wz wskazuje do tablicy dwoch elementow typu int

Niby wszystko jasne - powyższa instrukcja tworzy jeden wskaźnik do tablicy składającej się z dwóch liczb typu int. Jednak potem jest przedstawiony przykładowy program, w którym można zobaczyć takie oto instrukcje (przepiszę skróconą wersje programu):

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int zippo[4][2] = { {2,4}, {6,8}, {1,3}, {5,7} };
 
    int (*pz)[2]; //deklaracja wskaznika do tablicy wielowymiarowej
    pz = zippo; //przypisanie adresu pierwszego elementu tablicy wielowymiarowej, 
    //gdyz sama nazwa tablicy jest jednoczesnie adresem jej pierwszego elementu
 
    printf("*(*(pz+2)+1) = %d\n", *(*(pz+2)+1) );
    printf("pz[2][1] = %d\n", pz[2][1]);
 
    return 0;
}
 

Może mi ktoś wytłumaczyć, dlaczego w deklaracji wskaźnika do tablicy dwuwymiarowej mamy int (pz)[2]; , a nie np int(pz)[4][2], skoro jest to wskaźnik do tablicy [4][2]?
W powyższym przypadku napisaliśmy (pz)[2] - 2, ponieważ jest to tablica dwuwymiarowa? Czyli w przypadku tablicy trzy wymiarowej int zippo[4][6][2]; musielibyśmy napisać int (pz)[3]?

Może mi ktoś wytłumaczyć, na jakiej zasadzie deklaruje się wskaźniki do tablic wielowymiarowych? I jak by wyglądała deklaracja takiego wskaźnika dla np. takich tablic:

int zippo2[4][6][2];
int zippo3[2][4][6][8];
edytowany 2x, ostatnio: kario97, 2017-08-12 22:39

Pozostało 580 znaków

2017-08-15 20:25
1
kario97 napisał(a):

W powyższym przypadku napisaliśmy (pz)[2] - 2, ponieważ jest to tablica dwuwymiarowa? Czyli w przypadku tablicy trzy wymiarowej int zippo[4][6][2]; musielibyśmy napisać int (pz)[3]?

Nie, akurat ta 2-ka jest niefortunna. Nie bierze się z 2 wymiarowości tablicy, ale z tego, ze ma wymiar [4][2]. W przypadku [4][6][2] napisałbyś (*pz)[6][2]

Chyba już widzisz jak to się deklaruje? :)

edytowany 2x, ostatnio: Mr.YaHooo, 2017-08-15 20:27

Pozostało 580 znaków

2017-08-16 19:01
0

Czyli mam rozumieć, że przy deklaracji wskaźnika do tablicy wielowymiarowej muszę podać wszystkie wymiary z wyjątkiem pierwszego? Teraz rozumiem, ale dlaczego akurat tak? xd

Pozostało 580 znaków

2017-08-16 21:03

Przez analogię: usuń sobie z przykładu drugi wymiar [2]. Dostaniesz:

int zippo[4] = {2,6,1,5};
int pz*;
 
pz = zippo;

tu też pierwszy wymiar Ci niepotrzebny. Do wyznaczenia arytmetyki wskaźnika wystarczy znać wielkość elementów tablicy, a tu wiemy, że są rozmiaru int. Rozmiar tablicy jest niepotrzebny, jaka by nie była wskaźnik będzie poruszał się taka samo.
Jeśli jednak dodasz teraz drugi wymiar, czyli tak jak w przykładzie:

int zippo[4][2] = { {2,4}, {6,8}, {1,3}, {5,7} };
int (pz*)[2];
 
pz = zippo;

to masz wciąż tablicę 4-elementową ale nie int, a int[2]. Żeby wyznaczyć jak wskaźnik ma się poruszać, trzeba znać wielkość tego na co wskazuje, czyli wielkość tych wewnętrznych tablic. Rozmiar tablicy zewnętrznej nadal jest niepotrzebny.

Dalej dodając kolejny wymiar zwiększasz rozmiar elementu, który trzyma najbardziej zewnętrzna tablica, więc musisz go dokładnie określić, czyli:

int zippo2[4][2][6];

to 4-elementowa tablica int[2][6]. Rozmiary te musimy znać dokładnie, rozmiar zewnętrznej tablicy (tej [4]) już nie jest istotny.

Dokładnie tak :) - Mr.YaHooo 2017-08-17 20:53

Pozostało 580 znaków

2017-08-17 21:33
0

Wszystko już rozumiem. Dzięki za pomoc. :)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0