clamp(A, B, C) uses the middle value (B, the "preferred" value) by default, but clips it down to A if it would go smaller, or up to C if it would go bigger. Put a vw unit (proportional to viewport width) in the preferred slot — clamp(70px, 40%, 220px), say — and the value grows along with the screen (or container) until it hits the stated floor or ceiling, then stops there.
Getting the same effect with media queries means defining stepped values at each breakpoint — @media (min-width: …) { font-size: 18px } — and the value jumps abruptly at each one, with nothing happening in between. clamp() mathematically interpolates between the two bounds instead, turning the jump into a ramp — which is exactly why it's called "fluid" typography or layout.
The most common trap is leaving no relative unit in the middle term at all. clamp(16px, 16px, 32px) never moves regardless of viewport, because the preferred value is a fixed 16px — making it actually fluid requires a vw, a %, or a mixed calc() like 1rem + 2vw in that middle slot.
When to use
A reasonable default for most numbers that shouldn't be a single fixed value but also aren't worth defining separately at every breakpoint — heading sizes, card widths, section padding.