• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Tablice wielowymiarowe a wskaźniki - jak program rusza się po pamięci?

Object Storage Arubacloud
+2 głosów
2,977 wizyt
pytanie zadane 18 lutego 2016 w C i C++ przez Sinnley Stary wyjadacz (12,810 p.)

Witam, zgłębiam sobie temat tablic wielowymiarowych i wskaźników do tychże, napisałem sobie mały program, którym mogę sobie sprawdzać efekty różnych działań itd.

Problem mam jednak z tym, żeby zrozumieć jak działa tutaj komputer. Pamięć mamy przecież ułożoną liniowo. Jedna szufladka jest obok drugiej i wielowymiarowa tablica nie jest dla komputera przecież tak naprawdę tabelką.

Najpierw szybko częsc kodu programu:

int d_tablica[3][3];
	
	int n = 0;

	for (int i = 0;i <= 2; i++) {

		for (int j = 0;j <= 2; j++) {
			n++;
			d_tablica[i][j] = n;
			printf("%3d", d_tablica[i][j]);
		}

		cout << endl;

	}
	int z,x;
	bool b;
	do {
		cout << "podaj wiersz i kolumne: ";
		cin >> z >> x;
		cout << endl << endl << endl;
		cout << *(*(d_tablica + z) + x) << endl; // o tu
		cout << (int)&*(*(d_tablica + z) + x) << endl; // i tu
		cout << "kontynuowac?: ";
		cin >> b;
		cout << endl;
	} while (b == true);
	_getch();

Dlaczego zapis w linijkach z komentarzem przesuwa wskaźnik o różne ilosci bajtów? Gdybysmy wyobrazili sobie pamiec jako tabelke - oczywista oczywistosc. Jeden wskaznik przesuwa się w poziomie, a potem drugi przesuwa ten pierwszy w pionie. Natomiast każdy kto wie jak zbudowana jest pamięć zdaje sobie sprawe, że żadnych tabelek nie ma. Wobec tego dlaczego ( kiedy np ustawimy z i x na 1 ) program raz przesunie wskaznik o jedną szufladkę, a potem nagle o 3.  Przecież wskaźnik wskazuje na początek całej lini szufladek a nie na cały trzyszufladkowy obiekt.

3 odpowiedzi

+10 głosów
odpowiedź 18 lutego 2016 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 18 lutego 2016 przez Sinnley
 
Najlepsza

Pamięć operacyjną możemy sobie wyobrazić jako tablicę jednowymiarową (dlatego, ponieważ do każdej komórki tej pamięci odnosimy się dzięki jej adresowi, czyli pojedynczej liczbie).

Teraz omówmy kilka przypadków:

  • Tablice jednowymiarowe - Wszystkie jej elementy są umieszczone obok siebie. Nazwa tablicy jest wskaźnikiem na jej pierwszy element, czyli jest punktem odniesienia do reszty danych. Aby się dostać do innych elementów, stosujemy tzw. arytmetykę wskaźników.
  • Tablice dwuwymiarowe - Jest to w skrócie tablica jednowymiarowa tablic jednowymiarowych. Pierwsza tablica zawiera wskaźniki na pierwsze elementy kolejnych tablic. Należy pamiętać, że owe tablice mogą leżeć gdziekolwiek w pamięci (czyli tam, gdzie system znalazł miejsce dla takiej pojedynczej tablicy).
  • Tablice wielowymiarowe - Analogicznie, jak przy tablicy dwuwymiarowej. Np. tablica trójwymiarowa to tablica dwuwymiarowa tablic jednowymiarowych, gdzie pierwsza tablica zawiera jedynie odnośniki (wskaźniki) do tablic jednowymiarowych.
komentarz 18 lutego 2016 przez Sinnley Stary wyjadacz (12,810 p.)
I wyjasnione! :D

Gdzies pan znalazł te obrazki? :)
1
komentarz 18 lutego 2016 przez Patrycjerz Mędrzec (192,320 p.)

Własnej roboty cheeky

komentarz 18 lutego 2016 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Ja bym tak nie umiał ładnie narysować (co widać po moich kalamburach laughyes

komentarz 18 lutego 2016 przez Sinnley Stary wyjadacz (12,810 p.)
A w czym to zrobiłes? :D
komentarz 18 lutego 2016 przez Patrycjerz Mędrzec (192,320 p.)

W Paint'cie, czyli najlepszym edytorze grafiki wink

komentarz 18 lutego 2016 przez Eryk Andrzejewski Mędrzec (164,260 p.)

"najlepszym edytorze grafiki" - A w czapę chcesz? devil

+1 głos
odpowiedź 18 lutego 2016 przez Daaa22 Dyskutant (8,250 p.)

Świetne pytanie, zachęciłeś mnie do przeszukania google. Oto co znalazłem:

http://marek.piasecki.staff.iiar.pwr.wroc.pl/dydaktyka/skp/W11_wskazniki_na_tablice_wielowymiarowe_i_funkcje.pdf
 

komentarz 18 lutego 2016 przez Daaa22 Dyskutant (8,250 p.)

Ja to zrozumiałem tak, ale może się mylę.

int tab[2][3];

W pamięci kompa

/---------------------\   /---------------------\  /---------------------\ 
|   tab[0],tab[1]   |   tab[0],tab[1]  |   tab[0],tab[1] |
|_____________| |_____________| |_____________|
         tab[0]                 tab[1]                 tab[2]

 

Czyli rezerwuje 3 szufladki w których są 2 podanej wielkości (w tym wypadku int)

komentarz 18 lutego 2016 przez Sinnley Stary wyjadacz (12,810 p.)
Wygląda na to ze to prawda. Aczkolwiek nadal nie wyjaśnia to dlaczego komp traktuje nazwę tablicy jako wielkość w rozmiarze x * wielkość zmiennej. Operatorem sizeof nie potrafię tego sprawdzić bo zwraca on wartość całej tablicy tj. 3 * 3 * 4 = 36.
–2 głosów
odpowiedź 18 lutego 2016 przez adambalski1 Obywatel (1,010 p.)
Czy chodzi ci o Nazwa tablicy to adres jej zerowego elementu.

Jeśli tak to [0][0], [0][1], [0][2], [1][0], [1][1], [1][2], [2][0], [2][1], [2][2]. Dla tablicy [3][3]
komentarz 18 lutego 2016 przez Sinnley Stary wyjadacz (12,810 p.)
Wiem o tym. Moje pytanie jest następujące. Dlaczego najpierw wskaźnik po dodaniu jedynki rusza się o 3 pola, a potem tylko o 1.

Podobne pytania

0 głosów
3 odpowiedzi 969 wizyt
pytanie zadane 29 maja 2016 w C i C++ przez 1naswiecie Początkujący (410 p.)
0 głosów
1 odpowiedź 142 wizyt
0 głosów
3 odpowiedzi 161 wizyt
pytanie zadane 12 listopada 2015 w C i C++ przez Pixel040 Gaduła (3,100 p.)

92,572 zapytań

141,422 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...