I thought the public keys were the same as the bitcoin address?
Addresses are the Public Key Hash (PubKeyHash) along with with version and checksum information encoded in Base58. When you send funds to a user you are sending it to their PubKeyHash (which your client reverses from the address you provide). This is why one reason why address reuse is discouraged. Once funds are spent from an address the actual PubKey is known (it included in the input so other nodes can validate the signature).