here's a concrete example of an actual abstraction: strings. you can, if you are so inclined, carry around a raw byte buffer together with information about how large the buffer is, how much of the buffer is used, etc. but that's error-prone. every place you have to use the string, you have to keep all of these things straight in your head. make sure the right size is associated with the right string, make sure you don't swap the size and capacity arguments to a function, yadda yadda yadda.
this is why string manipulation in C sucks so hard.
or. you can stick all those raw parts in a struct, say "do not look at the bits behind the curtain," and just traffic in strings, like a normal first-class data type. that's an abstraction. it doesn't have to be a class (but it helps), it doesn't have to involve inheritance or dynamic dispatch. you're replacing a big bag of complexity with a reification of its corresponding high-level concept. that's abstraction.