Τι εννοείς όταν λες κλήσεις συστήματος;
Την memcpy() χρησιμοποιεί για να αντιγράψει πρώτα τα περιεχόμενα του y σε ένα προσωρινό buffer που το ορίζει με όνομα: swap_temp (άρα αυτό το όνομα δεν μπορεί να χρησιμοποιηθεί πουθενά αλλού μέσα στο πρόγραμμα). Κατόπιν τη χρησιμοποιεί για να αντιγράψει τα περιεχόμενα του χ στο y, και μετά για να αντιγράψει τα περιεχόμενα του swap_temp στο x.
To βάζει όλο μέσα σε ένα do-while (0) για να καταστραφεί το buffer: swap_temp μόλις βρει το δεξί άγκιστρο, μιας και είναι ορισμένο ως τοπική μεταβλητή (auto) μέσα στο scope του loop, ενώ για μέγεθος του swap_temp απαιτεί ο χώρος που πιάνουν στη μνήμη τα x και y να είναι ισοδύναμος, αλλιώς ορίζει το μέγεθος του buffer σε -1.
Π.χ. άμα ως x του περάσουμε έναν int και ως y ένα char, το swap_temp ορίζεται με μέγεθος -1. Σε αυτή την περίπτωση η όλη διαδικασία αποτυγχάνει
σιωπηλά δυστυχώς (ο compiler δεν το "πιάνει" μιας και οι παράμετροι των macros είναι ανεξάρτητες από τύπους δεδομένων).
Και τέλος, για να δουλέψει σωστά πρέπει να κάνουμε include το <string.h> για την memcpy().
ΥΓ. @star_light:

Μην απογοητεύεσαι ρε συ, εγώ και τα διδάχτηκα σε πανεπιστημιακό επίπεδο και τα εξάσκησα και real-life επί πολλά χρόνια. Αν μάθεις όμως καλά τη C είναι περίπου σαν να έχεις μάθει όλες τις γλώσσες (πλην του αντικειμενοστραφούς προγραμματισμού, που κι αυτός όμως θα σου φανεί πολύ ευκολότερος).