Najlepsza odpowiedź
(int *) p to jawne rzutowanie typu dla wartości przechowywanej w zmiennej p na typ wskaźnika, którego adres wskazuje na liczbę całkowitą. Wartość, którą przechowuje p, jest adresem pamięci pierwszego bajtu z 4, które są używane do przechowywania wspomnianej 32-bitowej (4-bajtowej) liczby całkowitej.
Wskaźnik przechowuje liczbę, która powinno być adresem do określonej lokalizacji w pamięci (sterty lub stosu). Typ danych przechowywanych w tej lokalizacji może być cokolwiek iw tym wyrażeniu określamy (a raczej zakładamy), że jest to 4-bajtowa liczba całkowita.
Wartość p może zostać skasowana przed przypisaniem jej do innego wskaźnika –
int *c = (int *) p;
Lub można wyłuskać odwołanie w celu pobrania wartości przechowywanej w adresie przechowywanym przez p jako takie –
int c = *((int *) p);
Lub , jeśli p rzeczywiście jest wskaźnikiem, można by go wyłuskać bez niego jest jawnie , ponieważ wiemy, że przechowywana w nim wartość jest 4-bajtową liczbą całkowitą.
Dla uproszczenia nie sprawdziłem wskaźników zerowych. Najważniejsze jest, aby sprawdzić, czy wskaźnik nie jest pusty, ponieważ wyłuskiwanie pustego wskaźnika powoduje awarię.
Przykład wartości zerowej check –
if (p != null)
printf(“int is ‘\%d’”, *p);
Teraz zakładając adres jest poprawny, a wskaźnik nie jest null, i że typ danych przechowywanych w lokalizacji pamięci jest w rzeczywistości liczbą całkowitą, konsola wydrukuje ją poprawnie .
Oto szczegółowy i dobrze wyjaśniony artykuł, na który natknąłem się kilka lat temu, o tym, jak czytać wskaźniki w c – Zasada zgodna z ruchem wskazówek zegara / spirala
Odpowiedź
Aby zrozumieć, co robi tam (int *), warto zrozumieć, co robi malloc (sizeof (int)). Niech „s podziel to od prawej do lewej.
Najpierw mamy sizeof (int). Jest to wartość reprezentująca liczbę bajtów wymaganych do reprezentowania liczby całkowitej w pamięci. Może to być 4 lub inna liczba w zależności od komputera, na którym programujemy.
Więc funkcja malloc () w rzeczywistości pobiera parametr taki jak 4, a la malloc (4). Ta funkcja pyta Biblioteka C, aby znaleźć się gdzieś w pamięci i odłożyć na bok 4 bajty (co okazuje się być dokładnie odpowiednim rozmiarem, aby zawierać liczbę całkowitą).
Teraz funkcja malloc zawsze zwraca adres tej pamięci. Przypomnij sobie ten komputer pamięć jest ułożona szeregowo, a każdy adres w pamięci jest unikalny. Teraz malloc () nie jest bardzo inteligentną funkcją – mówisz, ile pamięci chcesz, i mówi „oto jest”. Nie wie co chcesz umieścić w tej pamięci – wie tylko, o ile pamięci prosiłeś.
Ponieważ malloc () nie wie, co chcesz umieścić w tej pamięci, zwraca typ o nazwie (void *), czyli dowolny adres pamięci, inaczej zwany wskaźnikiem. Na większości nowoczesnych komputerów adres jest wartością 64-bitową, którą można przedstawić w 8 bajtach pamięci – ale komputery różnią się r, a różne komputery mogą zwracać różne rozmiary. Zatem malloc () może zwrócić 8 bajtów danych w formacie (void *).
Na koniec musimy dostać się do pamięci, którą dała nam malloc (), abyśmy mogli traktować ją jako zawierającą liczba całkowita. Jak to zrobimy? malloc () właśnie dał nam wskaźnik do jakiejś pamięci gdzieś w kosmosie. Robimy to, mówiąc kompilatorowi, że adres pamięci, który otrzymaliśmy z malloc (), jest w rzeczywistości adresem liczby całkowitej. Stąd twoje (int *).
Teraz, kiedy już to przeszedłeś, kompilator w pełni rozumie, czego chciałeś, ponieważ zadałeś sobie trud opisania każdego kroku: potrzebujesz ośmiobajtowego adres wskazujący na czterobajtową lokalizację w pamięci, która z kolei zawiera liczbę całkowitą.
I to właśnie oznacza całe to wyrażenie!