• 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.

Konkurs Mistrz Programowania
0 głosów
422 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 353 wizyt
pytanie zadane 26 października 2015 w C i C++ przez Krowa751 Nowicjusz (120 p.)
0 głosów
4 odpowiedzi 421 wizyt
0 głosów
1 odpowiedź 339 wizyt

93,656 zapytań

142,577 odpowiedzi

323,100 komentarzy

63,174 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

Kursy INF.02 i INF.03
...