Właśnie dostałem zadanie, aby dowiedzieć się, jak działa ten kod.

int array[rows][coloums]; 
int *pointerArray[rows]; 
for (int i = 0; i < rows; i++) { 
  pointerArray[i] = array[i]; 
  for (int j = 0; j < coloums; j++) { 
   *(pointerArray[i] + j) = 0; 
  } 
}

Ciekawi mnie tylko *(pointerArray[i] + j), myślę, że to to samo co pointerArray[i][j], ponieważ możesz uzyskać dostęp do elementu w obie strony, ale czy ktoś może mi powiedzieć, co to jest faktycznie dzieje się z *()? Na przykład skąd kompilator wie, że pytam o to samo, co pointerArray[i][j]?

Dzięki za odpowiedzi!

4
Destidom 25 wrzesień 2012, 01:41

2 odpowiedzi

Najlepsza odpowiedź

W tym kontekście operator * jest operatorem dereferencji. Wartość, którą poprzedza, będzie lokalizacją w pamięci, w której zwróci wartość.

Nawiasy grupują operację dodawania, dzięki czemu kompilator wie, że wynik tego dodawania zostanie użyty do wyłuskania. To po prostu kwestia kolejności operacji.

Pamiętaj, że operator [] robi to samo, co operator wyłuskiwania, ponieważ tablice są zasadniczo rodzajem zmiennej wskaźnikowej. Jeśli wyobrazisz sobie dwuwymiarową tablicę jako dwuwymiarową siatkę wartości z wierszami i kolumnami, w pamięci dane są ułożone w taki sposób, że każdy wiersz jest ciągnięty jeden po drugim w kolejności sekwencyjnej. Pierwszy indeks w tablicy (i) wraz z typem tablicy (int) informuje kompilator, w jakim przesunięciu ma szukać pierwszej lokalizacji w wierszu. Drugi indeks w tablicy (j) mówi, w jakim przesunięciu w tym wierszu szukać.

*(pointerArray[i] + j) zasadniczo oznacza: "Znajdź początek i-tego wiersza danych w pointerArray, a następnie wybierz j-ty element tego wiersza i podaj mi tę wartość .

2
Ben Richards 25 wrzesień 2012, 01:50

Kiedy robisz pointerArray[i] + j, żądasz elementu pointerArray[i], który jest int*, i zwiększasz ten wskaźnik o j (zwracając również int*). *(...) po prostu wyłuskuje wskaźnik i zwraca int w tej pozycji. * jest nazywany operatorem wyłuskiwania (w tym przypadku). Więc tak, to jest równoważne pointerArray[i][j].

3
Luchian Grigore 25 wrzesień 2012, 01:43