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

O co chodzi wskaźnikom? Pomoc w zrozumieniu wskaźników.

Object Storage Arubacloud
0 głosów
237 wizyt
pytanie zadane 13 grudnia 2015 w C i C++ przez asfreestyle Obywatel (1,310 p.)

Cześć, 
pisze właśnie program na odwracanie macierzy, skonstruowany tak, że mam wskaźnik na tablice ze wskaźnikami na liczby w tablicy, wytłumaczył by mi ktoś co oznaczają podwójne wyznaczniki tablicy ? 

double **Tab;

tak zdefiniowany wskaźnik na wskaźniki tablicy ( o ile dobrze rozumiem) mam w głównym pliku cpp (main), wszystkie funkcje typu Transponowane mam w innym pliku wysyłam tam wszystkie dane. podaje przykład jednej z funkcji. 

double** TransposeTable(double** tab, int size){


    double **Tab2;
    Tab2 = (double**)malloc(size*sizeof(double*));

    for (int i = 0; i < size; i++)
        Tab2[i] = (double*)malloc(size*sizeof(double));

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

        for (int j = 0; j < size; j++)
            *(*(Tab2 + i) + j) = *(*(tab + j) + i);
    }
    return Tab2;
}

Samo przesyłanie plików rozumiem, wyznaczniki też w miarę wiem o co chodzi, problem pojawia się gdy próbuje rozkminić co tak naprawdę zwróci mi funkcja gdy wpisze *tab , samo tab , czy np. jak jest różnica miedzy 

*(*(Tab + w) + k) =

a

(*(*(tab)+w))

Kiedy mam wskaźnik na liczbę w tablicy a kiedy wskaźnik na tablice wskaźników? Ciężko mi to wytłumaczyć, mam nadzieje że ktoś jest obeznany w tym remacie i pomoże zrozumieć o Co tak naprawdę chodzi tym wskaźnikom? 

PS. Aha używam malloca, tak tak wiem jest przecież funkcja new, ale niestety.  (wymogi uczelni) 

 

4 odpowiedzi

+1 głos
odpowiedź 13 grudnia 2015 przez Krawiec91 Pasjonat (19,600 p.)
*(*(Tab + w) + k) 

Jest to zapis równoznaczny do:
 

Tab[w][k]

Czyli odwołanie się do wartości znajdującej się w wierszu w, kolumnie k tablicy dwuwymiarowej Tab.

 

(*(*(tab)+w))

Jest to odwołanie się do wartości znajdującej się w wierszu w, kolumnie 0 tablicy dwuwymiarowej tab.
 

tab[w][0]

 

komentarz 17 grudnia 2015 przez asfreestyle Obywatel (1,310 p.)

Rozumiem, a co jeśli chcę mieć wskaźnik tylko na wiersze a kolumny zapisywać normalnie w nawiasach kwadratowych w taki sposób :

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

		double* indice = tab[i];
		for (int j = 0; j < size; j++) {
			indice[j] = (rand() % 19 + 1)-10; 
		}
	}

To była bardzo prosta funkcja przypisuje tablicy losowe znaki po prostu, ale jak mogę takim właśnie sposobem zapisu "swobodnie poruszać" się po tablicy, gdy na przykład muszę macierz transponować, czyli zamienić nr. wiersza z nr. kolumny? Poniżej przykład jak to napisałem na czystych numerach wierszy i kolumn. 

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

		for (int j = 0; j < size; j++)
			Tab2[i][j] = tab[j][i];
	}
	return Tab2;

 

 

komentarz 18 grudnia 2015 przez Krawiec91 Pasjonat (19,600 p.)

Zapis z użyciem wskaźników i zapis z użyciem indeksów są sobie równoważne. Działają identycznie, tylko różnią się zapisem.  Nie widzę sensu przeplatania jednego z drugim (pointer lub indeks). Przeróbka programu #1 na same pointery:
 

for (int i = 0; i < size; i++) {
 
    double* indice = *(tab+i);
    for (int j = 0; j < size; j++) {
        *(indice+j) = (rand() % 19 + 1)-10; 
    }
}

Program #2:
 

for (int i = 0; i < size; i++) {
 
        for (int j = 0; j < size; j++)
            *(*(Tab2+i)+j) =*(*(tab+j)+i)
    }
    return Tab2;

 

0 głosów
odpowiedź 13 grudnia 2015 przez niezalogowany
W skrócie **wsk to wskaźnik do wskaźnika który może na cos wskazywać np Int a Int *b=&a Int **c=&b Z reszta Ci nie powiem bo nie wiem. Wskaźnik do wskaźnika nie byl jeszcze nigdy przeze mnie użyty ale z tego co wiem tego głównie się używa przy tablicach wielowymiarowych. Nie wiem czy jest możliwe zrobienie ******wsk ale jesli tak to czas. Chciałbym zobaczyć program w ktorym tego się użyje.
komentarz 13 grudnia 2015 przez Patrycjerz Mędrzec (192,320 p.)

Polecam zapoznać się z moim tematem: https://forum.pasja-informatyki.pl/53331/wskazniki-kilka-pytan.

0 głosów
odpowiedź 18 grudnia 2015 przez Mateusz11 Pasjonat (22,910 p.)
Proszę wszystkie kody źródłowe brać w znacznik "CODE"!
0 głosów
odpowiedź 18 grudnia 2015 przez Dorion300 Szeryf (90,250 p.)
double ** Tab wskazuje na Wskaźnik który wskazuje na obiekt.

dobule *** Tab wskazuje na wskaźnik który wskazuje na wskaźnik który wskazuje na obiekt.

I tak dalej.

Podobne pytania

0 głosów
2 odpowiedzi 221 wizyt
pytanie zadane 26 października 2015 w C i C++ przez Krowa751 Nowicjusz (120 p.)
0 głosów
4 odpowiedzi 270 wizyt
0 głosów
1 odpowiedź 266 wizyt

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 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!

...