To verify a digital signature you need the public key. But the public key can not be recovered from a bitcoin address. So how is signing done?
If you're talking about the signature verification when someone sends a transaction, the public key is sent in the scriptsig of the transaction so nodes can verify the signature. The scriptsig contains both the signature and the public key. If it doesn't verify, the transaction is invalid.
If you mean a message that is signed by an address, the signature will contain necessary information that can be used to calculate the public key. From there, once the signature is verified to be signed by that public key, the public key can be converted into a Bitcoin address.
Private key is used to sign the message. With the private key, you can get the public key, RIPEMD 160 hash and public key hash.