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!
2 odpowiedzi
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ść .
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]
.
Podobne pytania
Powiązane pytania
Nowe pytania
c++
C ++ to język programowania ogólnego przeznaczenia. Pierwotnie został zaprojektowany jako rozszerzenie C i ma podobną składnię, ale teraz jest to zupełnie inny język. Użyj tego tagu w przypadku pytań dotyczących kodu (który ma zostać) skompilowany za pomocą kompilatora C ++. Użyj znacznika specyficznego dla wersji w przypadku pytań związanych z określoną wersją standardu [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] lub [C ++ 23] itp. .