Formally, an address is calculated from a public key, and the public key itself is only revealed on the blockchain when a transaction is signed. But in practical terms, an address fulfills the role of a public key as is familiar from other cryptography schemes. See APIs like validateaddress to see the differences.